Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: 1 ... 3 4 5 [6]   Вниз
  Печать  
Автор Тема: Процессы  (Прочитано 112861 раз)
0 Пользователей и 1 Гость смотрят эту тему.
v.korleone
Помогающий

ua
Offline Offline

« Ответ #150 : 07-01-2009 12:12 » 

Вад, вопрос где нужно ставить это:(?)
Код: (C++)
Event=CreateEvent(NULL,       // Атрибут защиты
                  TRUE,       // Тип сброса - ручной
                  FALSE,      // Начальное состояние, не сигнальное
                  "FirstStep" // Имя объекта
                  );          // Создание события
                 
if (_beginthread(NULL, 0, InOut, &inouts[1], 0, &tid)==-1)
        cout << "Error begin thread " << endl;
if (_beginthread(NULL, 0, InOut, &inouts[2], 0, &tid)==-1)
        cout << "Error begin thread " << endl;
if (_beginthread(NULL, 0, InOut, &inouts[3], 0, &tid)==-1)
        cout << "Error begin thread " << endl;
if (event!=NULL){
                Sleep(1000);
                SetEvent(event);
                Sleep(1000);
                ResetEvent(event);
                CloseHandle(event);
        }
        else {cout << "error create event" << endl;}
Делаю на основе примера: http://netcode.ru/cpp/?click=r-4047.php.htm
Я думаю, что должно быть как-то так:
Код:
...
HANDLE Thread[3];// Імитация 4-х процессоров
HANDLE Event;
...
int main()
...
IOput inouts[4];
    inouts[0].src = a;
//----------------------------
Event=CreateEvent(NULL,       // Атрибут защиты
                  TRUE,       // Тип сброса - ручной
                  FALSE,      // Начальное состояние, не сигнальное
                  "FirstStep" // Имя объекта
                  );          // Создание события
                 
if (_beginthread(NULL, 0, InOut, &inouts[1], 0, &tid)==-1)
cout << "Error begin thread " << endl;
if (_beginthread(NULL, 0, InOut, &inouts[2], 0, &tid)==-1)
cout << "Error begin thread " << endl;
if (_beginthread(NULL, 0, InOut, &inouts[3], 0, &tid)==-1)
cout << "Error begin thread " << endl;
if (event!=NULL){
Sleep(1000);
SetEvent(event);
Sleep(1000);
ResetEvent(event);
CloseHandle(event);
}
else {cout << "error create event" << endl;}   
//-----------------------------   
    Thread[0] = (HANDLE)_beginthreadex(NULL, 0, InOut, &inouts[0], 0, &tid);
    WaitForMultipleObjects(1, Thread, TRUE, INFINITE);
    CloseHandle(Thread[0]);
Что писать в этих скобках: (?) (NULL, 0, InOut, &inouts[1], 0, &tid) потому, что InOut,inouts[1] вызывает подозрение и мое и компилятора.
« Последнее редактирование: 07-01-2009 12:17 от v.korleone » Записан
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #151 : 07-01-2009 12:48 » 

Чтобы копипаст не был бездумным, три вопроса:
Код:
		Sleep(1000);
SetEvent(event);
Sleep(1000);
ResetEvent(event);
CloseHandle(event);
1. Зачем всё это в главном потоке?
2. Почему последняя строчка (уничтожение объекта) - ещё до запуска всех потоков?
3. Как потоки узнают о существовании события и необходимости его ожидать?

Что писать в скобках? Те параметры, которых требует функция Улыбаюсь Кстати, что делает весь этот код, который ты привёл вторым блоком?
Записан
v.korleone
Помогающий

ua
Offline Offline

« Ответ #152 : 07-01-2009 13:02 » 

Там так написано:

Цитата
После некоторой задержки устанавливаем его в сигнальное состояние SetEvent(), выжидаем некоторое время, чтобы потоки среагировали и сбрасываем ResetEvent()
Во втором блоке, куча ошибок, просто привел последовательность, она правильна или нет?
А какие параметры требует функция, в примере вот так стоит:
(Test1,1024,NULL)
в моем случае как-то так (NULL, 0, InOut, &inouts[0], 0, &tid).
Вад, что делать с этой функцией?
if (_beginthread(Test1,1024,NULL)==-1)
      cout << "Error begin thread " << endl;
Как записать для моего случая?
Дошел до вот этого у себя:
Код:
IOput inouts[4];
    inouts[0].src = a;
//----------------------------
Event=CreateEvent(NULL,       // Атрибут защиты
                  TRUE,       // Тип сброса - ручной
                  FALSE,      // Начальное состояние, не сигнальное
                  "FirstStep" // Имя объекта
                  );          // Создание события

if (_beginthread(InOut,1024,&inouts[1])==-1);
cout << "Error begin thread " << endl;
if (_beginthreadex(InOut,1024,&inouts[2])==-1)
cout << "Error begin thread " << endl;
if (_beginthreadex(InOut,1024,&inouts[3])==-1)
cout << "Error begin thread " << endl;
if (event!=NULL){
Sleep(1000);
SetEvent(event);
Sleep(1000);
ResetEvent(event);
CloseHandle(event);
}
else {cout << "error create event" << endl;}
//-----------------------------
    Thread[0] = (HANDLE)_beginthreadex(NULL, 0, InOut, &inouts[0], 0, &tid);
    WaitForMultipleObjects(1, Thread, TRUE, INFINITE);
    CloseHandle(Thread[0]);
относительно всех трех строчек типа "if (_beginthread(InOut,1024,&inouts)==-1);" компилятор пишет это:
error: invalid conversion from `unsigned int (*)(void*)' to `void (*)(void*)'
error: initializing argument 1 of `long unsigned int _beginthread(void (*)(void*), unsigned int, void*)'
Что делать?
« Последнее редактирование: 07-01-2009 21:36 от v.korleone » Записан
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #153 : 07-01-2009 21:46 » 

Цитата
Код:
if (_beginthread(InOut,1024,&inouts[1])==-1);
cout << "Error begin thread " << endl;
if (_beginthreadex(InOut,1024,&inouts[2])==-1)
cout << "Error begin thread " << endl;
if (_beginthreadex(InOut,1024,&inouts[3])==-1)
cout << "Error begin thread " << endl;
Это что за потоки? Для чего они все вообще нужны?

Не пытайся скопипастить пример к себе. Лучше разберись, как оно всё работает: как создать событие, как его установить в сигнальное состояние, как передать в потоки дескриптор для события (HANDLE), и как там ждать, пока событие не случится (т.е. не будет выставлено в сигнальное состояние).
Записан
v.korleone
Помогающий

ua
Offline Offline

« Ответ #154 : 07-01-2009 21:53 » 

Может поможешь разобраться? Направить на истинный путь?
Записан
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #155 : 07-01-2009 22:01 » 

А чего направлять? Всё сказано по твоей ссылке и, надо полагать, по не открывающейся на той странице ссылке с общим описанием "что такое Event" (наверное, тащили с firststep, хотя чёрт их знает) - наверное, вот с этим: http://www.firststeps.ru/mfc/msdn/r.php?83

1. Читаешь документацию (если не хватит - ищешь учебник), понимаешь, как работают события (Events) и как их применять.
2. Добавляешь в свой код
3. Если всё вроде верно, но почему-то не работает (т.е. ты чётко понимаешь, что делаешь, но где-то остаётся ошибка) - показываешь код, будем разбираться.
Записан
v.korleone
Помогающий

ua
Offline Offline

« Ответ #156 : 12-01-2009 20:00 » new

Вад, огромное спасибо за помощь, разъяснения и поучения.
Тема закрыта.
Записан
Страниц: 1 ... 3 4 5 [6]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines