Re[4]: Обновление данных на диалоге из отдельного потока
От: Master Gekus Россия  
Дата: 10.06.07 03:33
Оценка:
Здравствуйте, dcb-BanDos, Вы писали:

MG>>Да уж... Из серии "из пушки по воробьям"... Если речь о потоках — то либо связываем с контролом не CString, а CStatic, и непосредственно вызываем SetWindowText, либо вообще напрямую SetDlgItemTetx( IDC_..., );


DB>может ты не заметил, что это надо делать из другого потока

DB>имхо SendMessage в данном случае лучший вариант

Ну, вообще-то, я не тормоз, я медленный газ... И на подобные вещи внимание обращаю...
SetWindowText собственно и вызывает SendMessage( WM_SETTEXT, ... ); У уж SendMessage сама переключиться в нужный поток (из Remarks по SendMessage):

If the specified window was created by a different thread, the system 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.

А адресное пространство у потоков общее — так что и с этим проблем нет... Да и если в другой поток отправлять — тоже не есть смаое страшное, так как отдублирует система копию строки в адресное пространство другого процесса.
А вызов метода CWnd::SetWindowText — просто напрямую вызывает ::SetWindowText.

Вобщем, можно, конечно, и двухуровневую схему закрутить — но получиться то же самое, только через двойной вызов SendMessage. Работать-то будет, конечно. Но вот лучший ли это вариант? Тут я уже не уверен...

И в Вашем, и в моём случае происходит переключение в контекст другого потока и блокировка вызывающего до завершения обработки — только у Вас на один SendMessage больше, и существенно больше кода, плюс, видимо, придётся заводить какое-то своё сообщение для обмена с основным потоком. Чтобы не блокировать вызывающий, можно было бы воспользоваться PostMessage — но тут уже нужно создавать копию текста, т.к. неизвестно, что станет с оригиналом, пока дело дойдёт до его обработки в основном потоке.

Хотя, конечно, потренироваться в подобных вещах не вредно — ну, на будущее...

С уважением,
Заливочкин Евгений

P.S. Подобную фишку (интерфейсный диалог и поток, выполняющий длительное дейстие) пишу на автомате года этак с 95-го... Пришлось даже вспоминать, почему так делаю и не задумываюсь. Еще раз убедился, что не со зла . Спасибо — иногда полезно вспоминать хорошо забытое старое...

P.P.S. — А вообще-то всё это в Рихтере было!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.