Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > AfxBeginThread, проблема с запуском функции


Автор: lv151 29.6.2009, 17:44
Код

LRESULT CDialog1::OK() 
{                
................
    AfxBeginThread(ThreadProc, NULL);    
        строка1
        строка2
       строка3
}




Запускаю под отладчиком, сначала проходят:
строка1
строка2
строка3
А только после этого ThreadProc.

Автор: jonie 29.6.2009, 19:03
ну и в чем проблема? С чего вы взяли что нить будет выполнена немедленно (оторвите руки тому, кто вам такое сказал)? Она будет выполнена тогда когда на это появится время, и будет полностю инициализирована. Поставьте Sleep(1000) после AfxBeginThread и все в большинстве случаев будет так как хочется Вам.

Автор: Earnest 29.6.2009, 20:12
Цитата(jonie @  29.6.2009,  20:03 Найти цитируемый пост)
Поставьте Sleep(1000) после AfxBeginThread и все в большинстве случаев будет так как хочется Вам. 

Но тоже не обязательно, хотя и скорее всего. Но на 333 раз может произойти сбой. Если между потоками нужно обеспечить фиксированную очередность исполнения кусков кода, необходима синхронизация.

Автор: lv151 30.6.2009, 09:02
Запускается только один поток.
В функцию потока передаётся указатель на класс, delete для него срабатывает до того как запуститься функция потока.

Автор: jonie 30.6.2009, 09:44
и что вы хотите этим сказать нам?

Автор: lv151 30.6.2009, 10:03
Цитата(jonie @  30.6.2009,  09:44 Найти цитируемый пост)
и что вы хотите этим сказать нам? 

Уже ничего. Появилась другая проблема.
В функцию потока передаю CListCtrl, при InsertString в него всё виснет. smile

Автор: Earnest 30.6.2009, 10:31
Оболочки, производные от CWnd , валидны только внутри потока, где созданы. Не все, но некоторые MFC-функции будут ругаться. Но виснет у тебя, возможно, из-за какого-то deadlock'а. InsertString реализуется через SendMessage, а это дело в потоке вполне может вызвать взаимоблокировку.  Лучше всего 1) не работать с окнами в чужом потоке 2) если уж приспичило, передавай HWND и делай все манипуляции через API (по крайней мере, можно выбирать, какой функцией сообщение послать).

Автор: lv151 30.6.2009, 10:35
Цитата(Earnest @  30.6.2009,  10:31 Найти цитируемый пост)
Оболочки, производные от CWnd , валидны только внутри потока, где созданы. Не все, но некоторые MFC-функции будут ругаться. Но виснет у тебя, возможно, из-за какого-то deadlock'а. InsertString реализуется через SendMessage, а это дело в потоке вполне может вызвать взаимоблокировку.  Лучше всего 1) не работать с окнами в чужом потоке 2) если уж приспичило, передавай HWND и делай все манипуляции через API (по крайней мере, можно выбирать, какой функцией сообщение послать). 

ОК.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)