Вопрос в сабже. Ситуация следующая: в основном потоке программы создается рабочий поток для выполнения некоторой работы и диалоговое окно содержащее дочерний контрол (progress bar), предназначенный для индикации объема работы выполненной рабочим потоком. Все управление этим дочерним контролом поручается рабочему потоку. Рабочий поток, посылая сообщения дочернему контролу, использует hWnd полученный в основном потоке при обработке сообщения WM_INITDIALOG поступившего для родительского по отношению к этому контролу диалогового окна. Собственно здесь и возникает вопрос: безопасно ли так делать? Если нет, то хотелось бы знать, как это обычно реализуют.
Вообще, лучше месаджами и работать. Либо создавать Events. Только Events - не указатель на функцию, а системный Event (CreateEvent). Можно через указатели на функцию, но они требуют дополнительной синхронизации и такая особенность: вызываемая функция будет выполняться в потоке в котором произошёл "вызов" её указателя, и это иногда приводит к путанице. Так как код функции может быть описан в коде другого окна и якобы другого потока, а выполняться в действительности будет... Не тем потоком, как ожидалось. Хотя можно и к ним приспособиться.
Oleg_SK Собственно здесь и возникает вопрос: безопасно ли так делать? безопасно, причем лучше использовать сообщения, чем евенты. схема примерно такая: в процессе работы рабочий поток шлет главному потоку сообщения через SendMessage(типа wm_progress), при этом происходит переключение в контекст главного потока (апдейт прогресс-бара и т.п.), а рабочий поток засыпает на время обработки сообщения. после завершения работы шлется SendMessage(типа wm_complete), в обработчике ты закрываешь свое окно с прогресс-баром. евенты лучше не использовать по той причене, что WaitForSingleObject суспендит поток (а соответственно и очередь сообщений), поэтому будут проблемы с отрисовкой контролов (обработка wm_paint etc.)
Trashy Я так и делаю Max Да, я примерно так и делаю. Только вместо функции SendMessage я использую PostMessage, т.к. она меньше (по идее) тормозит рабочий поток ALL Собственно вопрос возник когда, прочитав что окна принадлежат потокам а не процессам, я засомневался, будет ли хэндл окна полученный в одном потоке действителен в другом. И хотя сейчас все работает нормально я решил все-же задать этот вопрос здесь.
я засомневался, будет ли хэндл окна полученный в одном потоке действителен в другом более того, хэлп на SendMessage "...If the specified window was created by a different thread, Windows switches to that thread and calls the appropriate window procedure. Messages sent between threads are processed only when the receiving thread executes message retrieval code. The sending thread is blocked until the receiving thread processes the message" то есть ты сразу получаешь и синхронизацию потоков в одном флаконе