![]() |
Доступ из рабочего потока к интерфейсу
Народ такая проблема: прога под Винду на С\С++ на МФС, есть два потока основной он же интерфейсный то есть основная задача - отрисовка окон и рабочий там из MySQL сервера я витягиваю даные и запихаю в масивчик паралельно в том же потоке я пытаюсь добавить данные в окно вызивая ф-ю контролерра окна ( СMyDialog::AddRowInList(...) ) в лист контрол.
Прикол заключаетса в том что на проверке "есть ли окно?" ф-я ( BOOL IsWindow(HWND) ) видет FALSE типа мол окна нету но оно есть!!!! Да поток написан в стиле WinAPI и ето добавления в лист контррол единое что присутствует из MFC. Поток создаю через ВиньАПИ ф-ю CreateThread(...). Есть вариант что поток "не МФС" ( создан не через AfxBeginThread(...) ) и по етому немогу нормально работать с окнами. Помогите может кто уже с таким сталкивался?! |
A как вы в потоке получаете (или передаете туда) HWND диалога?
Если вы пытаетесь получить указатель на диалог в другом потоке по его HWND то запросто можно получить указатель на временный объект вместо указателя на диалог. Что- то вроде CWnd* pWnd = CWnd::FromHandle(hwnd); СMyDialog* pDlg = (СMyDialog*)(pWnd); Если такой код выполнить в другом потоке ( не в потоке в котором был создан диалог) то вы можете получить указатель на временный объект. В MFC есть понятие Thread State. Сделайте поиск по "Thread State" в MSDN, может найдете объяснение это проблеме. Я бы сделал следующее : из потока посылал бы диалогу месседжи со стрингами которые нужно добавить в окно. То-есть в LPARM или WPRAM, помещал бы указатель на стриг. Причем лучше не пользоваться в этом случае CString-ом, а мессадж посылать SendMessageTimeout. А в диалоге написал бы обработчик этого месседжа, в котором бы вынимал стринг из параметра и добавлял бы его в окно |
2 alexey_ma:
В поток я передаю как параметр указатель на структурку которую заполняю в интерфейсном потоке где и есть HWND окна. Я уже думал про меседжи окну но есть одно но: мне нужно знать точно когда будет закончена вставка стриги в лист контрол... для того что бы отобразить процес в прогрес-баре. |
С месседжами будет нормально. Выход из SendMessage происходит после обработки сообщения принимающим окном/потоком. Можете продвигать прогресс бар в обработчике сообщения.
|
2 alexey_ma:
Хм... а ведь SendMessage блокирующая ф-я... Спасибо за идею... |
Можно так-же использовать SendMessageTimeout
|
2 alexey_ma:
Спасибо! проблема решена |
Цитата:
читай правила правила :contract: Удачи! |
| Часовой пояс GMT +4, время: 17:51. |
Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.