Здравствуйте, Mandigal, Вы писали:
M>Здравствуйте, BlackHeretic, Вы писали:
BH>>Здравствуйте, Mandigal, Вы писали:
M>>>У меня есть в проге длительная операция (рассчет CRC32 для файлов больше 1GB) и я хочу для нее создать отдельный рабочий поток
M>>>Делаю как в хелпах писано
M>>>Глобальную управляющую функцию
M>>>UINT MyThreadProc( LPVOID pParam )
M>>>{
M>>> CTestDlg::testThread();
M>>>return 0;
M>>>}
M>>>и ее вызов
M>>>void CTestDlg::OnBnClickedB1()
M>>>{
M>>>AfxBeginThread(MyThreadProc,NULL);
M>>>}
M>>>Но естественно глобальная MyThreadProc не может видеть CTestDlg::testThread(); (ну или я подставлял содерживое testThread(), там тоже все рассчитано что функция выполняется в классе CTestDlg), мне знакомый посоветовал что можно объявить MyThreadProc как член класса CTestDlg и просто написать оболочку(глобальную) для запуска ее, но у меня не получилось.
M>>>Пожалуйста подскажите как, если можно с примерами, потому как я с потоками вообще еще не работал и пока непонимаю принципов (прочтение MSDN не помогло
( )
BH>>Вместо NULL передавай HWND диалога. А как закончишь расчет перешли результат через SendMessage.
BH>>Номер сообщения получай через RegiterWindowMessage
BH>>Удачи
M>Хорошо, я передал HWND диалога с помощью GetSafeHwnd()
M>а дальше мне его как использовать?
M>и зачем мне передавать что-то через SendMessage если функция CTestDlg::testThread() и так сама в эдитбоксы значения записывает
M>Суть в том что в CTestDlg::testThread() находиться тот же код который раньше был в CTestDlg::OnBnClickedB1(), просто я хотел эту всю операцию отдельным потоком сделать
Вызывать методы из другого потока, особенно которые меняют что-то, небезопасно. Как минимум данные могут быть не корректны. А сообщение придет в рамках потока диалога и не с кем не законфликтует. Ловить это лучше в WindowProc диалога. Просто я тока вчера написал реализацию подобной байды — тока у меня нужно было по HTTP кое что скачивать. Все чудненько работает