Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Клуб профессиональных программистов :: Выпуск #106


Клуб профессиональных программистов «Весельчак У»
Информационная рассылка сайта и форума.  Выпуск 106.  15 декабря 2010 г.

Здравствуйте, уважаемые читатели!


Приятного чтения!




Требуется помощь!

Админстрация форума просит помощи: в HTML-коде нашей рассылки есть изъяны, связанные с расползанием блоков с исходными кодами программ в некоторых почтовых программах и браузерах. Посмотрите, пожалуйста, эту тему — может быть вы сможете помочь исправить эти недостатки.

В предыдущей статье мы весьма неформально рассмотрели проблемы, возникающие при конкуренции нескольких процессов за некий дефицитный ресурс, и некоторые способы решения этих проблем. Теперь пришла пора поговорить о механизмах взаимодействия процессов, а также о проблемах, возникающих при этом взаимодействии, и способах их решения. Как и прежде, мы постараемся сначала обсудить вопрос в наиболее общей форме, а затем учесть специфику встроенных систем на базе простых микроконтроллеров.

Наиболее простая ситуация возникает, когда параллельные процессы в системе никак не взаимодействуют между собой. Они не подозревают о существовании друг друга, в идеале вообще не пересекаются, в крайнем случае конкурируют за общий ресурс. Простой (хотя и несколько надуманный) пример — две расчетные задачи, одновременно выполняемые на многопроцессорной машине и выводящие результат на принтер, плоттер или другое медленное (по отношению к скорости вычислений) устройство вывода (конечно же, на самом деле в современных операционных системах вывод на печать производится через спулер, поэтому ни одной задаче не придется ждать, пока принтер освободится).

Картина усложняется, когда процессы должны взаимодействовать между собой. Это взаимодействие подразумевает обмен информацией. Иногда эта информация минимальна — фактически единственный бит, который сообщает о факте наступления события (например, освободилось место в кольцевом буфере). Иногда одного лишь знания о наступлении события мало, нужны дополнительные данные (например, завершено быстрое преобразование Фурье и можно забирать результат). Механизмы обмена данными могут быть очень простыми (общая для двух или более процессов область оперативной памяти) или сложными (каналы обмена сообщениями, сокеты, удаленные объекты, очереди сообщений и т.п.).


Реальный пример...


Рассмотрим такой пример. Наше приложение для микроконтроллера работает в качестве вольтметра-регистратора. Аналого-цифровой преобразователь (АЦП) в цикле измеряет входное напряжение. Когда цикл преобразования завершен, возникает прерывание. Программа обработки прерываний от АЦП помещает результат измерения в некоторую переменную. Программа каждую секунду считывает текущее значение напряжения из этой переменной, нормирует его и по интерфейсу RS232 отправляет на компьютер, который обрабатывает результаты измерений.

Предположим, что наш АЦП имеет разрешение 10 бит (типичное значение для АЦП, встроенных в низкобюджетные микроконтроллеры). Для хранения этого значения нам потребуется 16-битная буферная переменная: младшие 8 бит результата будут храниться в младшем байте переменной, старшие 2 бита — в старшем байте переменной (рис. 1). В данном случае мы предполагаем, что выбранная нами архитектура поддерживает представление Little-endian, но это непринципиально и не нарушает общности наших рассуждений в целом.

...



Полностью статью можно прочесть на нашем сайте, в разделе «Начинающим::Теория».

  • Программирование :: Общий
  • Всем доброго времени суток.
    Все началось с гугла. С его функции исправления ошибок и опечаток в поисковых запросах. Мне стало очень интересно, как современные системы проверяют орфографию. Интересует конкретно алгоритм: по пунктам как и что делается. Плевать на реализацию. Хочу знать как оно работает.
    Все что смог найти интересного, но пока не могу понять как оно может мне помочь, так это алгоритм Стемминга для русского языка (Russian stemming algorithm). После я зарылся глубже в поисковики, но без результатов.

    По моим размышлениям необходимо посчитать расстояние между словами. Как это можно сделать - должны быть методы, но ничего пока хорошего не нашел. Подскажите куда копать?
  • Заставили задуматься слова Трея Нэша:

    Цитировать
    Существует популярная идиома при генерации события - инициировать его внутри метода protected virtual по имени On<event>... Таким образом, производные классы могут легко модифицировать действия, предпринимаемые, когда должно быть инициировано событие...

    Т.е. в виртуальном методе protected virtual OnClick он предлогает вызывать событие при клике мыши, допустим. Но ведь в MFC и в Delphi подобным образом обзывали методы, обрабатывающие события. Ну и я так в дальнейшем поступал: был базовый класс, который инициировал событие там, где нужно, а в protected virtual OnClick была его обработка у дочерних классов.
    Так, у меня есть базовый класс Document с методом protected abstract void OnLayerVisiblyChanged(object sender, MapSurrounds.ItemArgs e);. Где-то (допустим, в конструкторе) Document подписывается на событие LayerVisiblyChangedEvent, и когда оно происходит - вызывает метод void OnLayerVisiblyChanged(object sender, MapSurrounds.ItemArgs e). А уже дочерние классы сами решают, что должно происходить в этот момент.

    Так вот, решил разобраться. Читаю http://www.rsdn.ru/article/mag/200401/codestyle.XML. Там в разделе "события" пишут то же самое, что и у Трея Нэша:
    Код:
    public delegate void MouseEventHandler(object sender, MouseEventArgs e);
    public class MouseEventArgs : EventArgs
    {
      private int x;
      private int y;

      public MouseEventArgs(int x, int y)
      {
        this.x = x;
        this.y = y;
      }

      public int X { get { return x; } }
      public int Y { get { return y; } }
    }

    Код:
    public class Control
    {
      public event MouseEventHandler MouseMove;
      protected virtual void OnMouseMove(MouseEventArgs e)
      {//Вызов! А я тут всегда обработку пишу
        if (MouseMove != null)
          MouseMove(this, e);   
      }
    }

    Не могу понять, как так получилось и как все таки правильно? Почему в On<event> в MFC и в Delphi идет обработка события, а тут предлогают вызывать его.
  • Программирование :: .NET технология от и до
  • Всем привет.
    Хотелось бы узнать если способы ускорения отрисовки на форме. У меня такая ситуация если нажата левая клавиша мышки и мышка движется то происходит отрисовка точки (с помощью FillEllipse). Но обработка не поспевает и получается отрывистая линия.
    Вот скрин

    (http://forum.shelek.ru/index.php?action=dlattach;topic=26240.0;attach=5545)

    А вот обработчик здесь ни чего лишнего
    Код:
    private void gbGraph_MouseMove(object sender, MouseEventArgs e)
            {
                if (e.Button.Equals(MouseButtons.Left))
                {
                    graphicsObj.FillEllipse(Brushes.Black, e.X, e.Y, 5, 5);
                    Points.Add(new Point(e.X, e.Y));
                }
            }

    Заранее спасибо
  • Коллеги, возникла очередная проблема, может кто-то подскажет путь..
    Есть Windows-приложение на C#, оно запускает несколько thread'ов.
    Каждый thread использует обект типа System.Windows.Forms.NotifyIcon для отображения своей иконки в трее..
    По клику на иконке должно показываться контекстное меню.
    Если вкратце и по существу, то класс, который запускет поток, инициализирует иконку/меню так:
    Код: (C#)
    class Class1
    {
        private System.Windows.Forms.NotifyIcon notifyIcon;
        private MenuItem menuItemExitWatcher;
       
        private void menuItemExitWatcher_Click(object sender, EventArgs e)
        {
            // just write log record
        }

        private void initMenu()
        {
            notifyIcon = new NotifyIcon();
            notifyIcon.ContextMenu = new ContextMenu();
            menuItemExitWatcher = new MenuItem();
            notifyIcon.Icon = new System.Drawing.Icon("c:\\path_to_icon\\icon.ico");
            notifyIcon.Visible = true;
            notifyIcon.ContextMenu.MenuItems.AddRange(new MenuItem[] { menuItemExitWatcher });
            menuItemExitWatcher.Index = notifyIcon.ContextMenu.MenuItems.Count - 1; // Last
            menuItemExitWatcher.Text = "E&xit";
            menuItemExitWatcher.Enabled = true;
            menuItemExitWatcher.Click += new System.EventHandler(menuItemExitWatcher_Click);
        }
    }

    После этого класс запускает новый поток с функцией Execute внутри себя.
    Иконка появляется.
    Проблема в следующем: при клике на иконку ничего не происходит. Попытка повесить на нее обработчик события Click ничего не дает - событие не приходит вообще.
    Если делать без потоков, то проблема немного другая, но помогает понять суть первой..
    Если поставить перед void Main() модификатор [STAThread], и вызывать инициализацию иконки/меню в контексте основного потока (но все еще в объекте класса - не статическом), то при правом клике по иконке меню появляется. Однако, при клике на пункт меню опять же событие не приходит. При еще одном клике на любой пункт меню приходит первое событие.
    Как я понял из курения интернета - проблема связана с разными потоками и обработкой событий. То есть события то ли приходят не туда, то ли ждут в очереди, которая не так обрабатывается.. Что-то похожее есть, вроде,  тут..
    Хочется иметь несколько потоков, управляющих своими иконками.
    Кто подскажет решение или путь в котором двигаться?
    :(
  • Ребята, подскажите, пожалуйста, как найти на странице динамически созданный чекбокс(находится в гридвью)?
    Код:
      //создание чекбокса
                       CheckBox chb = new CheckBox();
                        chb.ID = "chbx";
                        container.Controls.Add(chb);

    на форме не могу найти, потому что решила использовать Master Page, до того (пока была обычная веб-форма) всё прекрассно находилось...=((

    вот так пытаюсь найти:
    Код:
     ContentPlaceHolder content = Master.FindControl("ContentPlaceHolder1") as ContentPlaceHolder;
     GridView grid = content.FindControl("gvCotegory") as GridView;
     CheckBox check = grid.Rows[0].FindControl("chbx") as CheckBox;

    check  =  null              =(( хотя ContentPlaceHolder точно находит  и таблицу вроде тож (не равна null)

    подскажите где я не права?..  :-&

    ЗЫ: C#, MVStudio 2010
  • Всем привет
    У меня такой вопрос как лучше сделать.

    У меня есть List объектов. Тип объекта определяется моим классом. Мне надо сделать dll которая
    сортировала (групировала) этот List. На входе List объектов, на выходе отсортированный List. Для сортировки я использую LINQ (да удобная штука) но там существует привязка к типу данных, т.е. обязательно надо указывать тип данных или в запросе ну ли в переменной которая получает результат (если использовать var я его не передам между методами).

    Так вот как мне сделать dll которая сортировала данные различных типов не зная их объявления. Т.к. просто программу уже реализовал теперь весь функционал надо перекинуть в dll. Пробывал использовать GetType(), но компилятор ругается о том что такого типа не существует (примерно так). Или такое не возможно. Прошу помочь  :-/
  • Программирование :: .NET технология от и до :: ASP.NET
  • Здравствуйте! Помогите пожалуйста решить следующую проблему: создала WebService в Visual Studio 2008. Из VS сервис в браузере открывается. Но непосредственно из браузера я WebService открыть не могу. В адресной строке пишу http://localhost/WebServiceMaria/WebServiceMaria/service1.asmx - "Не удается найти требуемую страницу"...  IIS версия 5.1. Обычные файлы html IIS обрабатывает, а asmx почему-то не хочет.. 

    Добавлено через 3 часа, 47 минут и 56 секунд:
    Service1.asmx все-таки открылся... Зато появилась еще одна проблема - при обращении одного из веб-методов к базе даннх браузер отображает следующую страницу:

    Добавлено через 3 минуты и 45 секунд:
    Подскажите, почему может возникать такая проблема?
  • Программирование :: С/С++
  • Дорогие программисты! Я не студент. Я изучаю Си++ ради собственного интереса, так сказать люблю все знать )), и вданный момент читаю книгу Эккеля по Cи++. Столкнулся в книге с такой задачей:
    Определите массив типа int. Получите начальный адрес массива и приведите его к типу void* при помощи оператора static_cast. Напишите функцию, в аргументах которой передаются void*, число (количество байтов) и значение. Функция должна присваивать передаваемое значение каждому байту в заданном интервале.
    Решил первую часть:
    int m1[10];
    cout<<"Adress m: "<<(long) m1<<endl;
    void* m2=static_cast<void*>(m1);
    Не могу написать функцию ))
    и почему каждому байту когда размер m2 4 байта. Если это даже глупый вопрос, подскажите хотя бы как найти ответ ))
  • Я написал вот такой код:
    Код:
    #include <windows.h>
    #include <iostream.h>
    #include <string.h>
    #include <conio.h>

    int main(void)
    {
    char *str1 = "Введите количество сотрудников: ";
    char *str2 = "Введите Ф.И.О. сотрудника: ";
    char *str3 = "Введите номер отдела: ";
    char *str4 = "Введите должность сотрудника: ";
    char *str5 = "Введите дату с которого сотрудник начал работу в формате дд.мм.гггг: ";
    char *str6 = "Введите номер отдела что бы увидеть информацию о сотрудниках данного отдела: ";

    struct sotrudniki
    {
           char fio[40];
           char nomerotdela[2];
           char dolshnost[20];
           char data[14];
    } msotrudniki[100];

    // Количество сотрудников
    int n;
    // Переменные для итерации цикла
    int i, j;

    // Переменная для указания номера отдела
    int numotdel;

    sotrudniki temp;

        CharToOem(str1, str1);
        CharToOem(str2, str2);
        CharToOem(str3, str3);
        CharToOem(str4, str4);
        CharToOem(str5, str5);
        CharToOem(str6, str6);
       
        cout << str1;
        cin >> n;
       
        // Заполняем структуру
        for (i = 0; i < n; i++)
        {
            cout << str2;
            cin >> msotrudniki[i].fio;
           
            cout << str3;
            cin >> msotrudniki[i].nomerotdela;
           
            cout << str4;
            cin >> msotrudniki[i].dolshnost;
           
            cout << str5;
            cin >> msotrudniki[i].data;
        }

        // Сортировка
        for (i = 0; i < n; i++)
        {
            for (j = i + 1; j < n; j++)
            {
    if (atoi(msotrudniki[i].data) > atoi(msotrudniki[j].data))
    {
               temp = msotrudniki[j];
               msotrudniki[j] = msotrudniki[i];
               msotrudniki[i] = temp;
                }
            }
        }
       
        cout << str6;
        cin >> numotdel;
       
        // Вывод
        for (i = 0; i < n; i++)
        {
            if (atoi(msotrudniki[i].nomerotdela) == numotdel)
               cout << msotrudniki[i].fio << " " << msotrudniki[i].dolshnost << " " <<  msotrudniki[i].data << endl;
        }
       
        getch();
        return 0;
    }

    И если я ввожу следующие:
    Введите количество сотрудников: 3
    Введите Ф.И.О. сотрудника: ivan
    Введите номер отдела: 1
    Введите должность сотрудника: admin
    Введите дату с которого сотрудник начал работу в формате дд.мм.гггг: 10.12.1981
    Введите Ф.И.О. сотрудника: dima
    Введите номер отдела: 1
    Введите должность сотрудника: admin
    Введите дату с которого сотрудник начал работу в формате дд.мм.гггг: 10.11.1981
    Введите Ф.И.О. сотрудника: ola
    Введите номер отдела: 1
    Введите должность сотрудника: admin
    Введите дату с которого сотрудник начал работу в формате дд.мм.гггг: 10.11.1982
    Введите номер отдела что бы увидеть информацию о сотрудниках данного отдела: 1

    И должны выводится в порядке уменьшения рабочего стажа, то есть так:
    dima admin 10.11.1981
    ivan admin 10.12.1981
    ola admin 10.11.1982

    А выводится так:
    ivan admin 10.12.1981
    dima admin 10.11.1981
    ola admin 10.11.1982

    Как поправить код, подскажите пожалуйста.
  • Вот такой вопрос  :confused:

    Есть 12 структур. В каждой из этих 12 структур есть абсолютно одинаковое поле.
    Хотелось бы создать цикл, пройтись по всем структурам и инициализировать данное поле.

    Можно ли такое реализовать?  :-/
  • Программирование :: С/С++ :: ANSI С/С++
  • Пример:

    Код: (c++)
    class A
    {
    public:
      int x;
      int y;
      A(int x, int y) : x(x), y(y) { };
    };

    typedef std::map<int, A*> ACollection;

    class B
    {
      ACollection list;
    public:
      const A & a(int index) const;
      const A * a(int index) const;
    };

    const A & B::a(int index) const
    {
      return *(list[index]);
    }

    const A * B::a(int index) const
    {
      return list[index];
    }

    Какие тут достоинства и недостатки у методов B::a?

    Код: (c++)
    // B b;

    var = b.a(1).x;
    var += b.a(1).y;

    ptr = b.a(1);
    var = ptr->x;
    var += ptr->y;

    С одной стороны, работа с ссылкой как-то проще. С другой, поиск в map для каждого доступа будет накладен.

    И с одной переменной (как с указателем) не поработаешь (даже если убрать const):

    Код: (c++)
    A &ref = b.a(1);
    ref = b.a(2); // присвоение b.a(1) = b.a(2)

    А указатель можно засунуть в delete...
    Или все же можно от такого предохраниться?
  • Добрый день.Я столкнулся с необходимостью освоить некоторые методы сортировки,такие как Быстрая сортировка,Сортировка Слиянием,Пирамидальная Сортировка и Порязрядная Сортировка.
    И,если с первой всё понятно,то с другими не всё так прозрачно.Прошу помочь разобраться в некоторых кусочках кодов,реализующих данные методы сортировки.
    Сортировка Слиянием
    Код:
    #include <iostream>
    #include <conio.h>
    using namespace std;
    template <class T>
    T* merge(T *m1, T* m2, int l1, int l2){
        T* ret = new T[l1+l2];
        int n = 0;
        // Сливаем массивы, пока один не закончится
        while (l1 && l2){
            if (*m1 < *m2){
               ret[n] = *m1;
               m1++; l1--;}
            else {
               ret[n] = *m2;
               m2++; l2--;}
           n++;}
        // Если закончился первый массив
        if (l1 == 0){
            for (int i=0; i<l2; i++){
                ret[n++] = *m2++;}}
        // Если закончился второй массив
        else {
            for (int i=0; i<l1; i++){
               ret[n++] = *m1++;}}
        return ret;}
     
    // Функция восходящего слияния
    template <class T>
    void mergeSort(T * mas, int len){
        int n=1, l, ost;
        T * mas1;
        while (n<len){
            l=0;
            while (l<len){
               if (l+n >= len) break;
               ost = (l+n*2>len) ? (len-(l+n)) : n;
               mas1 = merge(mas+l, mas+l+n, n, ost);
               for (int i=0; i<n+ost; i++) mas[l+i] = mas1[i];
               delete [] mas1;
               l+=n*2;}
           n*=2;
    }}
     
    int main()
    {
        float a[128];int dl;
        cout<<"Vvedite coli4estvo 4lenov v massive\n";
        cin>>dl;
        cout<<"Vvedite massiv\n";
        for(int i=0;i<dl;i++)
        {    cin>>a[i];}
       
        mergeSort(a, dl);
        for(int i=0;i<dl;i++)
            cout<<" "<<a[i];
                system("PAUSE");
        getch();
    }
    Непонятна функция mergeSort,а именно что за переменные такие l,n,ost и len.

    Пирамидальная Сортировка
    Код:
    #include <iostream>
    using namespace std;
     
    template<typename T>
    void downHeap(T a[], long k, long n) {
            //  процедура просеивания следующего элемента
            //  До процедуры: a[k+1]...a[n]  - пирамида
            //  После:  a[k]...a[n]  - пирамида
            T new_elem;
            long child;
            new_elem = a[k];
     
            while(k <= n/2) {               // пока у a[k] есть дети
                    child = 2*k;
                    //  выбираем большего сына
                    if( child < n && a[child] < a[child+1] )
                            child++;
                    if( new_elem >= a[child] ) break;
                    // иначе
                    a[k] = a[child];        // переносим сына наверх
                    k = child;
            }
            a[k] = new_elem;
    }
     
    template<typename T>
    void heapSort(T a[], long size) {
            long i;
            T temp;
     
            // строим пирамиду
            for(i=size/2-1; i >= 0; i--) downHeap(a, i, size-1);
     
            // теперь a[0]...a[size-1] пирамида
     
            for(i=size-1; i > 0; i--) {
                    // меняем первый с последним
                    temp=a[i]; a[i]=a[0]; a[0]=temp;
                    // восстанавливаем пирамидальность a[0]...a[i-1]
                    downHeap(a, 0, i-1);
            }
    }
    int main()
    {
     
            int arr[5] = {9,2,3,1,5};
            heapSort(arr,5);
     
            cout<<"[ ";
            for(int i = 0; i < 5; ++i)
                    cout<<arr[i]<<" ";
            cout<<"]"<<endl;
            system("PAUSE");
            return 0;

    }
    Здесь непонятна DownHeap,а конкретно,что с чем сравнивается в if'ах и почему child = 2*k.

    Подскажите,пожалуйста,что к чему...Заранее благодарю!
  • Компилятор - gcc (g++).

    Цитировать
    Events.cpp:139: error: no matching function for call to ‘models::Event::Event(models::Events* const, models::EventData*&)’
    Event.h:39: note: candidates are: models::Event::Event(models::Events*, models::EventData&)
    Event.h:34: note:                 models::Event::Event(const models::Event&)

    Event.h:
    Код: (c++,33,2,7)
    class Event
    {
        Events* const owner;
        EventData &data;

    public:
        Event(Events* const owner, EventData &initData) :
            owner(owner), data(initData)

    Ошибка выскакивает на компиляции метода класса Events.

    Event.cpp:
    Код: (c++,130)
            EventData* ed;
            Event* e;
    Код: (c++,139)
            e = new Event(this, ed);

    Непонятно:
    1. Почему компилятор игнорирует const в определении конструктора Event(Events* const owner, EventData &initData)?
    2. Почему он считает, что конструктор копирования по умолчанию здесь подходит? Ведь нет совпадений по параметрам!

    [offtopic]
    Нашел багу в теге подсветки: нумерация строк подсветки не понимает, что задана нумерация строк не с 1. В TODO...
    [/offtopic]


    Добавлено через 2 минуты и 12 секунд:
    Кстати, const_cast<Event*>(this) не помогает.

    Добавлено через 2 минуты и 26 секунд:
    Ошибку понял: this тут не при чем — второй параметр ссылка, а я подсовывал указатель.

    Второй вопрос остается открытым.
  • Программирование :: С/С++ :: WinAPI & Visual C++
  • Код: (C++)
    HMENU hMenu = GetMenu(Form1->Handle);

    for(int i=0;i<GetMenuItemCount(hMenu);i++)
    {

        EnableMenuItem( hMenu, i,   MF_ENABLED | MF_BYPOSITION );
        //здесь менюшки энаблятся


        HMENU hSubMenu = GetSubMenu( hMenu, i );

        if(hSubMenu!=NULL)
        {

            for(int j=0;j<GetMenuItemCount(hSubMenu);j++)
            {
                 EnableMenuItem( hSubMenu, j,   MF_ENABLED | MF_BYPOSITION );
               
                //а здесь почему-то не энаблятся

                char str[20];
                GetMenuString( hSubMenu,  j, str, 29, MF_BYPOSITION);
                ListBox1->Items->Add(str);
            }
        }


    Помогите разобраться с этой напастью.
    Просьба дать хотябы один примерчик.
  • Привет.
    Эта тема для меня темный лес, не знаю, как разобраться, поэтому просьба сильно не ругаться, если что :)

    В общем, мое приложение для своей работы загружает кое-какие ресурсы с винта.
    Для этого я просто в обычном блокноте написал пути и имена к нужным файлам-ресурсам на английском языке, сохранил как простой текстовый файл в кодировке utf-8.
    Мое приложение сначала загружает этот файл (пользуюсь CreateFile()), а затем, из файла читает (ReadFile) нужные данные, в том числе строковые, по которым грузит уже сами ресурсы в виде чисел и строк на английском языке.
    Никакого юникода - в настройках Visual Studio в пункте Character Set я поставил Multi-Byte.

    Теперь главное: как мне обеспечить, чтобы мое приложение работало во всех странах? Как я понимаю, английский есть на всех виндоусах для всех стран?

    Все ресурсы хранятся в текстовых файлах в кодировке utf-8, для работы со строками использую char.

    Вторая часть моего вопроса - можно ли использовать для этой части обычные однобайтовые символы, а для работы с разными языками (немецкий, франц. и т.д.) юникод-строки? (wchar_t и соответствующие ф-ии)?
  • Дамы и господа,

    Есть ли какой-нибудь законный (или не очень законный) способ узнать, что виртуальная функция с определённой сигнатурой будет расположена в таблице виртуальных функций под таким-то номером?

    Речь не о том, чтобы вызвать функцию, а именно в том, чтобы узнать номер.
  • Программирование :: VisualBasic
  • Подскажите, пожалуйста, как можно нажатием одной кнопки запустить два макроса. Зараннее спасибо
  • Программирование :: VisualBasic :: Visual Basic for Applications
  • Подскажите пожалуйста. Есть постоянно растущая (полувручную) таблица, типо база данных. Чтобы упростить ее заполнение - сделал форму с комбобоксами, каждой колонке таблицы соответствует свой комбобокс,  в каждой колонке значения время от времени повторяются, но иногда очень редко. В выпадающем списке комбобокса ищу нужное значение, и выбираю его. Так вот те, которые повторяются редко, в большой таблице становится отыскать все сложнее.

    Собственно вопрос - можно ли как то сделать, чтобы комбобокс показывал не содержимое всей колонки, а только уникальные значения из нее?

    Добавлено через 7 минут и 23 секунды:
    не нашол как редактировать сообщение - допишу. - чтобы комбобокс в форме показывал только уникальные значения по образу и подобию как это делает автофильтр на листе.
  • Программирование :: Java
  • Как определить количество запущенных потоков?
    нужно чтобы поток не выполнял действия пока есть другие потоки.

    У меня в случае если пользователь нажмет быстро на кнопку второй раз запускается тот же процесс  И в критической секции происходит deadlock. И соответственно при входе в критическую секцию в случае если запущено 2 потока второй должен подождать.


  • Имеется пара классов A и B, так что B extends A.

    У этих классов разные по числу параметров конструкторы A(int a) и B(int a, int b).

    Экземпляры этих классов создаются в результате парсинга строчек, так что:
    Код: (Java)
    A create(String s) {
      // ...
      return new A(a);
    }

    B create(String s) {
      // ...
      return new B(a, b);
    }
    Для удобства доступа есть желание поместить эти методы в некий общий класс Factory, чтобы эту фабрику можно было бы хранить в переменной и передавать в разные места как одно целое. Естественно, поместить в класс два метода, различающиеся лишь типом результата нельзя, но теоретически и по смыслу задачи можно специализировать вызовы для каждого случая использования.

    Если брать C++, получается такое решение:
    Код: (C++)
    #include <iostream>

    using namespace std;

    class A {
    public:
    A(int a) {
    cout << "A" << endl;
    }
    };

    class B: public A {
    public:
    B(int a, int b): A(a) {
    cout << "B" << endl;
    }
    };

    class Factory {
    public:
    template<class T>
    T *create() {
    return new T();
    }

    template<>
    A *create() {
    return new A(0);
    }

    template<>
    B *create() {
    return new B(0, 1);
    }
    };

    int main() {
    Factory factory;
    delete factory.create<A>();
    delete factory.create<B>();
    return 0;
    }

    В данном случае используется механизм специализации шаблона. Для каждого вызова create из main по шаблонному параметру выбирается, какую из трёх реализаций выбирать: обобщённую (generic) для неизвестных типов, либо одну из специализированных, если параметром задан класс A или B. В специальных реализациях вызываются нужные конструктры (со своим количеством параметров для каждого случая).

    В Java некоторые элементы специализации шаблонов имеются. В Java можно написать нечто вида X<T extends U> или для метода <T extends U>T f(). Но компилятор либо не использует информацию об ограничении типа параметра generic-типа или -функции, либо я чего-то не знаю. Можно ли такое сделать?

    P.S. Варианты с использованием Reflections и RTTI (конструкции наподобие instanceof или if(x.class == ...) ) не предлагать. Хочется иметь "автоматический" выбор нужной реализации фабричного метода на этапе компиляции.
  • Добрый день !
    Я начинающий программист в этой среде.(можно сказать совсем чайник)
    Сейчас делаю программу ,редактирования текста!
    Нужна ваша помощь,а то мне самому что-то тяжеловато разобраться.

    При открытий текста , хочу , чтоб выбираемый текстовый файл появлялся в TextArea....так как хочу его в дальнейшем редактировать..

    что надо писать в поле   textarea.read(new , evt)

    Код:
    package jfilechooserdemo;

    public class NewJFrame extends javax.swing.JFrame {

       
        public NewJFrame() {
            initComponents();
        }

     
        @SuppressWarnings("unchecked")
                           
        private void initComponents() {

            fileChooser = new javax.swing.JFileChooser();
            jScrollPane1 = new javax.swing.JScrollPane();
            textarea = new javax.swing.JTextArea();
            jMenuBar1 = new javax.swing.JMenuBar();
            jMenu1 = new javax.swing.JMenu();
            openFileMenuItem = new javax.swing.JMenuItem();
            jMenu2 = new javax.swing.JMenu();

            fileChooser.setDialogTitle("Это мое диалоговое окно открытия");

            setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

            textarea.setColumns(20);
            textarea.setRows(5);
            jScrollPane1.setViewportView(textarea);

            jMenu1.setText("File");

            openFileMenuItem.setText("Открыть текстовый файл");
            openFileMenuItem.addActionListener(new java.awt.event.ActionListener() {
                public void actionPerformed(java.awt.event.ActionEvent evt) {
                    openFileMenuItemActionPerformed(evt);
                }
            });
            jMenu1.add(openFileMenuItem);

            jMenuBar1.add(jMenu1);

            jMenu2.setText("Edit");
            jMenuBar1.add(jMenu2);

            setJMenuBar(jMenuBar1);

            javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
            getContentPane().setLayout(layout);
            layout.setHorizontalGroup(
                layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 400, Short.MAX_VALUE)
            );
            layout.setVerticalGroup(
                layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(layout.createSequentialGroup()
                    .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 215, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addContainerGap(64, Short.MAX_VALUE))
            );

            pack();
        }// </editor-fold>                       

        private void openFileMenuItemActionPerformed(java.awt.event.ActionEvent evt) {                                                 
        fileChooser.showOpenDialog(openFileMenuItem);

            [color=red][font=Verdana]  // Действие, которое необходимо произвести с файлом, например, просмотр в TextArea
              textarea.read(new , evt);[/font][/color]

        }                                               

       
        public static void main(String args[]) {
            java.awt.EventQueue.invokeLater(new Runnable() {
                public void run() {
                    new NewJFrame().setVisible(true);
                }
            });
        }

        // Variables declaration - do not modify                     
        private javax.swing.JFileChooser fileChooser;
        private javax.swing.JMenu jMenu1;
        private javax.swing.JMenu jMenu2;
        private javax.swing.JMenuBar jMenuBar1;
        private javax.swing.JScrollPane jScrollPane1;
        private javax.swing.JMenuItem openFileMenuItem;
        private javax.swing.JTextArea textarea;
        // End of variables declaration                   

    }

    Добавлено через 1 день, 27 минут и 53 секунды:
    Я понимаю, что для некоторых это может и фигня, но ответьте пожалуйста, очень надо....это по учебе!!!
  • Здравствуйте.
    Основное окно программы небольшое. Если пользователь отмечает в опциях соответствующий пункт, включается неактивный недекорированный JDialog, служащий однотонным фоном. Он запускается таким методом:

    Код:
    public void setShowBackground()
    {
    if(!jdlgBackground.isVisible())
    {
    jdlgBackground.setVisible(true);
    jfrm.toFront();
    }
    else
    {
    jdlgBackground.setVisible(false);
    }
    }

    Проблема в том, что при переключении фокуса на окно какой-нибудь другой программы и возврате, JDialog не отображается (т.к. он не активен).
    Пробовал решить проблему с помощью FocusListener'а, но после команды jfrm.toFront() снова возникает событие фокуса и начинаются жуткие лаги.
    Пробовал оформить FocusListener следующим способом:

    Код:
    jdlg.setVisible(false);
    jdlg.setVisible(true);
    jfrm.setFocusable(false);
    jfrm.toFront();
    jfrm.setFocusable(true);

    Но он почему-то не работает.
     Вопрос: можно ли как-то «закрепить» неактивный JDialog на фоне JFrame? Или можно добиться того же какими-нибудь другими средствами?
  • Здравствуйте.
    Не знаю как сформулировать вопрос для поисковика.
    'KeyListener' обрабатывает «флаги», показывающие, зажата ли кнопка.
    В основном классе бесконечный цикл, глядящий на эти флаги и выполняющий соответствующие действия.
    Примерно так:

    Код:
    boolean keyR, keyL;
    while(true)
    {
    if(keyR)
    // do some
    if(keyL)
    // do another
    }
    frame.addKeyListener(
    new KeyListener()
    {
    public void keyPressed(KeyEvent e)
    {
    int kc = e.getKeyCode();
    if(kc == 39)
    keyR = true;
    if(kc == 37)
    keyL = true;
    }

    public void keyReleased(KeyEvent e)
    {
    int kc = e.getKeyCode();
    if(kc == 39)
    keyR = false;
    if(kc == 37)
    keyL = false;
    }

    public void keyTyped(KeyEvent e) {}
    }
    );

    Вопрос. Как в конце цикла временно вернуть управление программой к ОС, чтобы KeyListener() обработал события (не выходя из цикла)?

    Заранее спасибо.
  • Программирование :: Программирование 1С
  • Здравствуйте! Есть Справочник Товары с такими реквизитами - Склад, ТипТовара, Цена. Также есть документ СписаниеТоваров форма которого имеет реквизиты - Склад, ТипТовара, Количество, Цена, Сума! Внимание, вопрос: как сделать так, чтобы при выборе заполнение поля ТипТовара формы СписаниеТоваров поле Цена заполнялося автоматически, ведь в Справочнику прописаны цены на все типы товаров...????

    Заранее спасибо!!! :)
  • Здравствуйте, помогите новачку, пожалуйста!

    У меня такой вопрос :-/: Есть склад, припустим на него пришло 100 единиц товара. Это у нас приход. Потом из этого склада мы хотим снять 101 единицу этого товара. Это расход. При выводи отчета говорит, что товара осталось -1 единица. Как сделать программно так, чтобы у случаях, когда мы хотим снять товара больше, чем его есть на складе, нам выводило сообщения, что это сделать невозможно, поскольку такого количества товара на складе нет????

    Модуль документа Расход:

    Процедура ОбработкаПроведения()

    ВыбратьСтроки();
    Пока ПолучитьСтроку()=1 Цикл

    Регистр.ОстаткиМатериалов.Материал = Материал;
    Регистр.ОстаткиМатериалов.Склад = Склад;
    Регистр.ОстаткиМатериалов.Количество = Количество;
    Регистр.ОстаткиМатериалов.ДвижениеРасходВыполнить();

    КонецЦикла;

    КонецПроцедуры


    Спасибо!!!
  • Программирование :: Программирование 1С :: 1С 7.x
  •  задача звучит так: необходимо списать со счёта 001 все основные средства.
    1С только изучаю, поэтому понятия не имею как это пишется.. подскажите плз.

     

    ДокБухС = СоздатьОбъект("Документ.БухгалтерскаяСправка");
        ДокБухС.Новый();
        ДокБухС.СодержаниеОперации="Списание Основных средств"  ;
     
        БухИт = СоздатьОбъект("БухгалтерскиеИтоги");     
        БухИт.ИспользоватьСубконто(ВидыСубконто.ОсновныеСредства,,1,);
        БухИт.ВыполнитьЗапрос(,ДатаСпис,"001",,,,,);
        БухИт.ВыбратьСубконто(1);
       
        Пока БухИт.ПолучитьСубконто(1)=1 Цикл
            Если БухИт.СКД()>0 Тогда
    //а вот здесь необходимо добавить проводку, и потом после добавления всех проводок записать, а как?           
            КонецЕсли;       
        КонецЦикла;
        ДокБухС.Записать;
  • Программирование :: Программирование 1С :: 1С 8.x
  • Доброго всем дня!

    Необходимо сформировать запрос:
    Выбрать все документы, в котороых "присутствует" определенный договор.
  • Всем привет! Подскажите пожалуйста! Есть готовая программа, хочу увидеть полный код программы, в конструктор залезал, там по частям можно увидеть некоторый код, а как увидеть весь? У меня версия 8.1.13.41. Очень нужно! Спасибо заранее!
  • Доброго всем вечера.

    В Макете, в ячейке создаю шаблон. В свойстве ячейки "Заполнение" указываю "Переносить"
    Когда в шаблоне параметры заполняются длинными  значениями, то текст не переносится.
    Как можно сделать так, чтобы текст распределялся равномерно по ячейке ?
  • Здравствуйте. Передо мной поставили такую задачу:
    Нужен механизм, обеспечивающий работу с внешними файлами в составе базы 1с (документа) . Хранить файл нужно однозначно в реквизите, тип Хранилище значения. Надо чтобы можно было:
    1. "прицепить" произвольный файл к документу
    2. открыть этот файл из документа
    3. редактировать этот файл с помощью другого приложения, например фотошопа.
    4. заменить/сохранить.
     
    По моему прошлому опыту программированию, это должно быть что-то вроде OLE - контейнера в delphi. Пролистав руководство разработчика нашёл главу "Механиз временного хранилища, работа с файлами". Для того чтобы прицепить какой-либо файл воспользовался методом

    Код:
     Перем ВыбранноеИмя;
    Перем АдресВременногоХранилища;

    ПоместитьФайл(АдресВременногоХранилища, "", ВыбранноеИмя, Истина);

    Как теперь можно открыть этот файл, для установленного другого приложения на компьютере, например фотошоп, чтобы он потом перезаписался в реквизите?


    Добавлено через 1 минуту и 19 секунд:
    Платформа 8.1
  • Необходимо зафиксировать рисунок с текстовым заполнением, чтоб конкретные размеры имел, а не растягивался вместе с автоувеличением высоты строк, на которых он расположен. Установка координат как до Вывода, так и после ничего не дает.
    Может, кто-то сталкивался с такой проблемой?
  • Не получается ничего придумать. Может, кто что подкажет.
    Макет состоит из нескольких строк с авто высотой, переносом. В результате ТабДок на печать может быть любого размера. А мне надо ограничить его по высоте, т.е., например, выводить только часть, что по высоте составляет пол страницы А4, остальное обрезать нафик. При этом не могу установить конкретную высоту строк, т.к. какая-то может быть пустой, какая-то довольно длинной...
    Спасибо отозвавшимся.
  • Добрый день

    есть внешняя обработка в 1С, необходимо во время формирования отчета через макет выводилась информация о регионе или городе местонахождения Контрагента. Информация об регионе и городе по определенным Контрагентам хранятся в РегистрСведения, каким способом его можно от-туда получать???
  • Операционные системы :: Unix и другие :: BSD
  • Есть FreeBSD 7.1, на ней крутится mpd 5, устанавливающий PPPoE соединение к провайдеру.

    Захотел я устроить VPN и для этого в mpd настроил PPTP-сервер с опциями, позволяющими подключаться Windows-клиентам.

    Теперь наблюдаю странные и непонятные явления.

    Если подключаться к PPTP-серверу изнутри локальной сети, то всё замечательно.

    Если подключаться к нему же из внешней сети через PPPoE-соединение (и другой интерфейс, обслуживаемый mpd), то всё дохнет. С точки зрения Windows-клиента соединение устанавливается нормально, проходит авториация, поднимается сетевой интерфейс и на этом всё затыкается - спустя некоторое время Windows обнаруживает, что интерфейс на самом деле дохлый, и сообщает об этом, предлагая переподключиться. С точки зрения сервера mpd, кажется, беззвучно помирает - так, что даже в логах не оставляет никакого описания того, что с ним произошло.

    Поглядеть на происходящее непосредственно на FreeBSD я пока не могу - надо тащить другую машину, ставить рядом, выводить в интернет через альтернативный канал. Когда соберусь всё это сделать - точно не знаю. Удалённо тоже поглядеть не могу, поскольку падение mpd приводит к обрыву ssh-сессии.

    Никто случайно с таким не сталкивался? Почему это происходит, и как это поправить?

    P.S. Вариант с перебросом не в тот туннель default-маршрута отпадает. Запретил все операции с маршрутами на сервере и клиенте, вбил статически маршруты на нужные адреса и интерфейсы. Ну и в таком случае mpd, думаю, в логах бы написал об обрыве PPPoE из-за отсутствия отклика удалённой стороны. Но не пишет ничего.
  • Направления программирования :: Drivers
  • Добрый день!
    В программировании драйверов я по сути новичок, но предо мной встала задача работы с Ethernet трафиком на уровне NDIS.
    По этому хотела бы прояснить для себя сначала концептуальные моменты.
    Суть задачи такова - перехватить пакет(ы), вычленить TCP/UDP заголовок и в зависимости от IP:Port
    принять решение пропустить/изменить/запретить.
    Перечитав форум и цикл статей Грома решила за основу взять passthru из DDK.
    Задача ещё осложняется тем, что мой родной язык - паскаль, и мне не всегда очевидны элементарные для сишника обороты  :-/

    И так суть вопросы:

    1. В каких функциях я должна анализировать пакеты?
    Исходящие, как я понимаю в MiniportSend и MiniportSendPackets,
    а входящие в ProtocolReceive и ProtocolReceivePacket?
    Если да, то как получить доступ к данным кадра? Правильно ли я понимаю, что в ProtocolReceive третий параметр - это указатель на данные пакета?
    А как быть с другими функциями?

    2. Если я захочу анализировать данные протокола более высокого уровня, например HTTP, неужели мне придётся
    собирать всю цепочку пакетов, чтобы вытащить от туда допустим POST параметры?

    3. Если в системе установлены два NDIS драйвера, которые имеют разное мнение о судьбе IP пакета, что произойдёт?

    Спасибо :)
  • Направления программирования :: Сети
  • В процессе тестирования сборки фрагментов в собственном TCPIP стеке возникла проблема тестирования: никак не удается спровоцировать сильную фрагментацию в отсылаемом из Windows приложения пакете. По техническим причинам стек не будет принимать пакеты больше 2000 байт, а если отправлять такой пакет из винды, получается максимум 2 фрагмента. Я пробовал задавать малые значения для SO_SNDBUF, но пакет режется все равно на уровне около 1500 байт. Как можно заставить сокет резать пакет помельче? Очень желательно получить с десяток фрагментов хотябы.
  • Направления программирования :: Web
  • День добрый. Развернул сайт на сервере IIS6, в сетке гуляет хорошо. Наружу смотрит через 443 порт. Должен смотреть, но увы.
    По имени снаружи пингуется нормально, но доступа по https нет. В IIS не силен, все что делал - для сайта указал SSL-порт 443, в Directory Security создал сертификат, как указано тут http://www.youtube.com/watch?v=7QPjXzVcvfI.
    Подключиться по https не выходит...
    Цитировать
    Internet Explorer не может отобразить эту веб-страницу

    Когда хожу напрямую http://cdr.citynet.kharkov.ua:443/
    Возникает ошибка 504
    Цитировать
    ReadResponse() failed: The server did not return a response for this request. 

    Что делать?

  • Направления программирования :: Web :: Клиентские скрипты
  • Вечер добрый.
    Столкнулся с JS - пришлось делать перенаправление с его помощью. Нашел метод

    Код:
                            var params = "menubar=no,location=no,resizable=yes,scrollbars=no,status=no"
                            window.open(obj.DirectUrl, 'Resource', params);
    но браузеры блокируют его, как всплывающее окно. До это (без JS) пользовался просто html-атрибутом _blank. Так же смотрел метод location - но он открывает в этом же окне. Подскажите аналоги, чтобы безвредно открывать страничку в новом окне (чтобы браузер не разценивал это как popup window)
  • Направления программирования :: Web :: Тестирование веб-сайтов
  • Собственно, сам сайт совсем не интересен и даже дизайн не прикручивали. А вот три информационных ресурса интересы с точки зрения интерграции картографического сервера, WCF и Silverlight'a. Особо доставит жителям Харькова.

    Небольшие FAQ:
    Основная цель аудитории - ресурс Дежурный план.
    в Дежурном плане векторные слои подключаются только при масштабе 1:500
    в Град. архиве - при 1:5000
    улез "Коммуникации" включает 38 слоев, так что возможны задержки с работой (напротив, узел "Растительность" - всего 1 слой)
    Отвектаризирован хорошо только географический центр.
    Поиск по улицам начинает работать при введении 2 и более букв.
    логин Publ
    пароль 123
    сертификаты придется подтверждать 2 раза

    https://cdr.citynet.kharkov.ua/Pages/InformResources
  • Практические разделы :: Программы
  • Здравствуйте! Подскажите, пожалуйста, можно ли реализовать такую ситуацию:
    1. Пользователь заходит на вэбстраницу.
    2. Через n секунд страница инициирует реконнект машины пользователя (или просто обрывает соединение).
    Хотелось бы использовать этот трюк для смены собственного динамического  ip.
    Спасибо.

А теперь прощаемся с Вами до следующего выпуска.


С уважением, команда Клуба.


В избранное