|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - [решено] С++ Builder и потоки (win32 api) |
|
C/C++ - [решено] С++ Builder и потоки (win32 api)
|
Новый участник Сообщения: 2 |
Профиль | Отправить PM | Цитировать
При обращении к компоненту из другого потока приложение зависает. Перед обращением первичный поток, создавший компонент переводится в состояние ожидания. Как только код не переписывал, но лучшее, что получилось, - это зависание при втором обращении.
Вот последняя (но не самая лучшая) версия: struct TThreadParam { TComponent *owner; HWND hwnd; // хэндл окна, информацию о котором нужно вывести }; DWORD WINAPI ThreadProcGeneral (LPVOID lparam) { TThreadParam *param = (TThreadParam *) lparam; DWORD error; HANDLE currentThreadHandle = OpenThread (THREAD_ALL_ACCESS, FALSE, GetCurrentThreadId()); TComponent *owner = param->owner; TLabeledEdit *lEdit = (TLabeledEdit *) owner->FindComponent("leHandle"); // выход пока не нужен, мне бы обновление сделать while (true) { HWND hwnd = param->hwnd; if (owner == NULL || hwnd == NULL) { continue; } lEdit->Text = "0x" + IntToHex((int) hwnd, 8); // вот тут зависает SetEvent (hEventGeneral); SuspendThread (currentThreadHandle); } return 0; } void TMainForm::InitThreads () { hThreadGeneral = = NULL; // хэндл потока, обновляющего вкладку "Общие" hThreadGeneral = CreateThread (NULL, 0, ThreadProcGeneral, (LPVOID) ¶m, CREATE_SUSPENDED, NULL); allThreads[0] = hThreadGeneral; allEventForThreads[0] = hEventGeneral = CreateEvent (NULL, FALSE, FALSE, NULL); } void StartUpdate () { int i; for (i = 0; i < COUNT_THREADS; i++) { ResetEvent (allEventForThreads[i]); } for (i = 0; i < COUNT_THREADS; i++) { ResumeThread(allThreads[i]); } } void __fastcall TMainForm::tvWindowsChange(TObject *Sender, TTreeNode *Node) { // DWORD error; if (Node->Selected == false) return; param.hwnd = (HWND) Node->Data; StartUpdate(); DWORD waitStatus = WaitForMultipleObjects (COUNT_THREADS, allEventForThreads, TRUE, INFINITE); error = GetLastError(); switch (waitStatus) { case WAIT_OBJECT_0: break; case WAIT_FAILED: return; } } |
|
Отправлено: 19:09, 17-12-2011 |
Новый участник Сообщения: 2
|
Профиль | Отправить PM | Цитировать Всё, разобрался. Не надо было первичный поток приостанавливать. Может это и неправильно, но это работает.
void __fastcall TMainForm::tvWindowsChange(TObject *Sender, TTreeNode *Node) { if (Node->Selected == false) return; param.hwnd = (HWND) Node->Data; StartUpdate(); } DWORD WINAPI ThreadProcGeneral (LPVOID lparam) { TThreadParam *param = (TThreadParam *) lparam; DWORD error; HANDLE currentThreadHandle = OpenThread (THREAD_ALL_ACCESS, FALSE, GetCurrentThreadId()); TComponent *owner = param->owner; TLabeledEdit *lEdit = (TLabeledEdit *) owner->FindComponent("leHandle"); while (true) { HWND hwnd = param->hwnd; if (hwnd == NULL) { continue; } lEdit->Text = "0x" + IntToHex((int) hwnd, 8); // вот тут уже не зависает SuspendThread (currentThreadHandle); } return 0; } |
Отправлено: 11:44, 18-12-2011 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
C/C++ - Builder 6.0 потоки | alextrs | Программирование и базы данных | 2 | 17-04-2008 21:32 | |
C/C++ - C++Builder Потоки | alextrs | Программирование и базы данных | 1 | 01-04-2008 11:14 | |
Win32 API | Нужна помошь по API функциям! | vasika_hk | Программирование и базы данных | 2 | 23-05-2006 09:51 | |
Win32 API | Дозвон | XCodeR | Программирование и базы данных | 5 | 08-04-2006 12:26 | |
Win32 API | Неизвестные функции | Savant | Программирование и базы данных | 9 | 02-03-2005 10:18 |
|