Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - [решено] С++ Builder и потоки (win32 api)

Ответить
Настройки темы
C/C++ - [решено] С++ Builder и потоки (win32 api)

Новый участник


Сообщения: 2
Благодарности: 1

Профиль | Отправить PM | Цитировать


Изменения
Автор: st_dark
Дата: 17-12-2011
Описание: случайно кнопку нажал
При обращении к компоненту из другого потока приложение зависает. Перед обращением первичный поток, создавший компонент переводится в состояние ожидания. Как только код не переписывал, но лучшее, что получилось, - это зависание при втором обращении.
Вот последняя (но не самая лучшая) версия:

Код: Выделить весь код
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
Благодарности: 1

Профиль | Отправить 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



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - [решено] С++ Builder и потоки (win32 api)

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
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




 
Переход