Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.143.214.230] |
|
Сообщ.
#1
,
|
|
|
Есть диалоговое приложение, на диалоге кнопка, запускающая поток, в котором вызывается DoModal другого диалога. Функция, запускающая поток:
void CProvStaticFontDlg::OnBnClickedButtonZapustitPotok() { // TODO: Add your control notification handler code here LPVOID pParam=(LPVOID) this; AfxBeginThread(PotokDialog, pParam); /// AfxMessageBox("Запустили поток"); Sleep(10000); if(d!=NULL) ::PostMessage(d->m_hWnd, WM_CLOSE, 0, 0); Sleep(5000); AfxMessageBox("Диалог должен закрыться"); } Функция потока: UINT __cdecl PotokDialog(LPVOID pParam) { CProvStaticFontDlg *pD=(CProvStaticFontDlg*)pParam; CTestDialogPotok dp; dp.SetText("Проверка инициализации текста в диалоге"); pD->d=(CWnd*) &dp; dp.DoModal(); pD->d=NULL; return(0); }; Диалог в функции потока создается только после выхода из функции запуска потока! Но если раскоментировать строку: /// AfxMessageBox("Запустили поток"); То диалог создается, и с ним можно работать, но после закрытия сообщения, диалог из потоковой функции снова подвисает до выхода из функции запуска потока. Я смотрел в MSDN работу потоков, там написано, что в каждом потоке свой цикл обработки сообщений и диалог из потоковой функции не должен зависать. Я так понимаю, что есть цикл сообщений для главного потока и есть циклы сообщений для параллельных потоков? Или не так? |
Сообщ.
#2
,
|
|
|
Цитата a_n_y_a @ Я смотрел в MSDN работу потоков, там написано, что в каждом потоке свой цикл обработки сообщений и диалог из потоковой функции не должен зависать. Я так понимаю, что есть цикл сообщений для главного потока и есть циклы сообщений для параллельных потоков? Или не так? В MFC есть два вида потоков рабочий и интерфейсный, т.е. поток в котором есть цикл обработки сообщений. Так вот у тебя создается рабочий поток. |
Сообщ.
#3
,
|
|
|
Цитата Cfon @ Цитата a_n_y_a @ Я смотрел в MSDN работу потоков, там написано, что в каждом потоке свой цикл обработки сообщений и диалог из потоковой функции не должен зависать. Я так понимаю, что есть цикл сообщений для главного потока и есть циклы сообщений для параллельных потоков? Или не так? В MFC есть два вида потоков рабочий и интерфейсный, т.е. поток в котором есть цикл обработки сообщений. Так вот у тебя создается рабочий поток. Я про интерфейсный поток никогда не слышал, мог бы ты рассказать о нем или дать ссылочку? Какая функция запускает интерфейсный поток? |
Сообщ.
#4
,
|
|
|
надо создать производный класс от CWndThread, и переопределиь InitInstance, в которой создавть свой новый диалог, потом передавать этот поток класса в AfxBeginThread. Сам класс чтобы не заморачиваться можно создать через мастер ClassView->Add Class.
Добавлено поток создается след образом: AfxBeginThread(RUNTIME_CLASS(CMyThread)); |