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

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Работа с потоками  (Прочитано 8643 раз)
0 Пользователей и 1 Гость смотрят эту тему.
SSW
Гость
« : 22-12-2004 10:35 » 

Есть такой код :

Код:
UINT ThreadProc(LPVOID param)
{
AfxGetThread()->m_nThreadID;

int iThread;
iThread=ClientID[CountIDTask];

DWORD dwWaitStatus; 
HANDLE dwChangeHandles[99];

dwChangeHandles[1] = HandleEvent[CountIDTask];
dwChangeHandles[0] = FindFirstChangeNotification(
FolderName,                     // directory to watch
FALSE, // do not watch subtree
FILE_NOTIFY_CHANGE_FILE_NAME); // watch file name changes


......


      dwWaitStatus = WaitForMultipleObjects(2, dwChangeHandles, FALSE, INFINITE);
 
      switch (dwWaitStatus)
      {
         case WAIT_OBJECT_0:
                AfxMessageBox("Есть изменение !!!");
           
if ( FindNextChangeNotification(dwChangeHandles[0]) == FALSE)
                 ExitProcess(GetLastError());
        break;
        case WAIT_OBJECT_0+1:
if (iThreadEvent[iThread]==1) // addNotifyFilter
{
   ss.Format("%i",iThread);
   AfxMessageBox("Событие для потока "+ss);
}
..........




Код:
...........
if (iID!=0) // Наш клиент
{   
CountIDTask++;
ClientID[CountIDTask]=ClientID[iID];
iThreadEvent[ClientID[CountIDTask]]=1; // cod  1 = addNotyfiFilter

// SetEvent(HandleEvent[ClientID[CountIDTask]]); // задаем событие для потока подключенного клиента
                SetEvent(HandleEvent[2]);                                         // задаем событие для потока 2 клиента
}

if (iID==0) // это новый клиент
{
CountIDClient++;
CountIDTask++;
ClientID[CountIDTask]=CountIDClient;
HandleEvent[ClientID[CountIDTask]]=CreateEvent(NULL,FALSE,FALSE,"event"); //создаем событие для потока нового клиента
CWinThread *pThread;
pThread=AfxBeginThread(ThreadProc, this); // запихиваем в поток
}
.............

Коротко суть :
Есть клиенты, которые конектятся к серверу, для каждого клиента должен быть один поток, при условии что количество заданий может быть много. Все это должна отслеживать WaitForMultipleObjects.
Проблема в том, что когда клиентов много и поступает новое задание, то я должен определить какой это клиент, и прервать выполнение потока именно для этого клиента. Потом добавить в масив для WaitForMultipleObjects хандел нового задания, и продолжить выполнение потока.
Если я делаю таким макаром, как указано в коде, то событе для одного потока ловится всеми потоками.
В принципе можно вычислить какой поток из "событийных"  мне нужен, но этож не дело. Молчу

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

Записан
ysv_
Помогающий

ua
Offline Offline

« Ответ #1 : 24-12-2004 19:16 » 

Каким образом формируется dwChangeHandles?
Записан
SSW
Гость
« Ответ #2 : 25-12-2004 12:16 » 

Поскольку обьявление HANDLE dwChangeHandles[99]; присутствует внутри функции которую я запихиваю в поток, то по идее, в каждом потоке будет свой масив этих dwChangeHandles.
При тестировании, нулевой HANDLE - это задание на смотр папок, первый на событийность для потока. В последствии этот масив будет расти с ростом задач поставленых серверу клиентом. Максимум - 99 (пока).
Я так понимаю, что WaitForMultipleObjects должна улавливать изменение любого обьекта HANDLE которого есть в масиве dwChangeHandles. Но поскольку она обьявляется внутри функции потока, то для каждого потока (по идеи) должен быть свой масив dwChangeHandles.
Или я не прав?
Записан
ysv_
Помогающий

ua
Offline Offline

« Ответ #3 : 26-12-2004 19:52 » new

Сам массив dwChangeHandles - локальный. Но вот HANDLEы, использованные для инициализации массива - не локальны. Думай в этом направлении.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines