IMHO.WS

IMHO.WS (https://www.imho.ws/index.php)
-   Программирование (https://www.imho.ws/forumdisplay.php?f=40)
-   -   Доступ из рабочего потока к интерфейсу (https://www.imho.ws/showthread.php?t=103815)

yan_kos 18.05.2006 12:12

Доступ из рабочего потока к интерфейсу
 
Народ такая проблема: прога под Винду на С\С++ на МФС, есть два потока основной он же интерфейсный то есть основная задача - отрисовка окон и рабочий там из MySQL сервера я витягиваю даные и запихаю в масивчик паралельно в том же потоке я пытаюсь добавить данные в окно вызивая ф-ю контролерра окна ( СMyDialog::AddRowInList(...) ) в лист контрол.
Прикол заключаетса в том что на проверке "есть ли окно?" ф-я ( BOOL IsWindow(HWND) ) видет FALSE типа мол окна нету но оно есть!!!!
Да поток написан в стиле WinAPI и ето добавления в лист контррол единое что присутствует из MFC.
Поток создаю через ВиньАПИ ф-ю CreateThread(...).
Есть вариант что поток "не МФС" ( создан не через AfxBeginThread(...) ) и по етому немогу нормально работать с окнами.
Помогите может кто уже с таким сталкивался?!

alexey_ma 18.05.2006 15:23

A как вы в потоке получаете (или передаете туда) HWND диалога?
Если вы пытаетесь получить указатель на диалог в другом потоке по его HWND то запросто можно получить указатель на временный объект вместо указателя на диалог.
Что- то вроде
CWnd* pWnd = CWnd::FromHandle(hwnd);
СMyDialog* pDlg = (СMyDialog*)(pWnd);
Если такой код выполнить в другом потоке ( не в потоке в котором был создан диалог) то вы можете получить указатель на временный объект.
В MFC есть понятие Thread State. Сделайте поиск по "Thread State" в MSDN, может найдете объяснение это проблеме.

Я бы сделал следующее : из потока посылал бы диалогу месседжи со стрингами которые нужно добавить в окно. То-есть в LPARM или WPRAM, помещал бы указатель на стриг. Причем лучше не пользоваться в этом случае CString-ом, а мессадж посылать SendMessageTimeout.
А в диалоге написал бы обработчик этого месседжа, в котором бы вынимал стринг из параметра и добавлял бы его в окно

yan_kos 18.05.2006 19:39

2 alexey_ma:
В поток я передаю как параметр указатель на структурку которую заполняю в интерфейсном потоке где и есть HWND окна.
Я уже думал про меседжи окну но есть одно но: мне нужно знать точно когда будет закончена вставка стриги в лист контрол... для того что бы отобразить процес в прогрес-баре.

alexey_ma 18.05.2006 21:13

С месседжами будет нормально. Выход из SendMessage происходит после обработки сообщения принимающим окном/потоком. Можете продвигать прогресс бар в обработчике сообщения.

yan_kos 19.05.2006 21:22

2 alexey_ma:
Хм... а ведь SendMessage блокирующая ф-я...
Спасибо за идею...

alexey_ma 21.05.2006 09:42

Можно так-же использовать SendMessageTimeout

yan_kos 23.05.2006 16:14

2 alexey_ma:
Спасибо! проблема решена

NetS 23.05.2006 16:27

Цитата:

yan_kos:
2 alexey_ma:
Спасибо! проблема решена
- запрещено создание сообщений типа "спасибо", "thanks" и т.п. Для выражения благодарности есть Персональные Сообщения (ПС) и Репутация пользователя

читай правила правила :contract:
Удачи!


Часовой пояс GMT +4, время: 17:51.

Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.