imho.ws
IMHO.WS  

Вернуться   IMHO.WS > Компьютеры > Программирование
Опции темы
Старый 18.05.2006, 12:12     # 1
yan_kos
Junior Member
 
Аватар для yan_kos
 
Регистрация: 16.07.2005
Адрес: Украина, г. Ровно
Пол: Male
Сообщения: 140

yan_kos Известность не заставит себя ждать
Доступ из рабочего потока к интерфейсу

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

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

Я бы сделал следующее : из потока посылал бы диалогу месседжи со стрингами которые нужно добавить в окно. То-есть в LPARM или WPRAM, помещал бы указатель на стриг. Причем лучше не пользоваться в этом случае CString-ом, а мессадж посылать SendMessageTimeout.
А в диалоге написал бы обработчик этого месседжа, в котором бы вынимал стринг из параметра и добавлял бы его в окно
__________________
Best Regards
alexey_ma вне форума  
Старый 18.05.2006, 19:39     # 3
yan_kos
Junior Member
 
Аватар для yan_kos
 
Регистрация: 16.07.2005
Адрес: Украина, г. Ровно
Пол: Male
Сообщения: 140

yan_kos Известность не заставит себя ждать
2 alexey_ma:
В поток я передаю как параметр указатель на структурку которую заполняю в интерфейсном потоке где и есть HWND окна.
Я уже думал про меседжи окну но есть одно но: мне нужно знать точно когда будет закончена вставка стриги в лист контрол... для того что бы отобразить процес в прогрес-баре.
yan_kos вне форума  
Старый 18.05.2006, 21:13     # 4
alexey_ma
Member
 
Регистрация: 10.03.2002
Адрес: Israel
Сообщения: 245

alexey_ma Нимб уже пробиваетсяalexey_ma Нимб уже пробивается
С месседжами будет нормально. Выход из SendMessage происходит после обработки сообщения принимающим окном/потоком. Можете продвигать прогресс бар в обработчике сообщения.
__________________
Best Regards
alexey_ma вне форума  
Старый 19.05.2006, 21:22     # 5
yan_kos
Junior Member
 
Аватар для yan_kos
 
Регистрация: 16.07.2005
Адрес: Украина, г. Ровно
Пол: Male
Сообщения: 140

yan_kos Известность не заставит себя ждать
2 alexey_ma:
Хм... а ведь SendMessage блокирующая ф-я...
Спасибо за идею...
yan_kos вне форума  
Старый 21.05.2006, 09:42     # 6
alexey_ma
Member
 
Регистрация: 10.03.2002
Адрес: Israel
Сообщения: 245

alexey_ma Нимб уже пробиваетсяalexey_ma Нимб уже пробивается
Можно так-же использовать SendMessageTimeout
__________________
Best Regards
alexey_ma вне форума  
Старый 23.05.2006, 16:14     # 7
yan_kos
Junior Member
 
Аватар для yan_kos
 
Регистрация: 16.07.2005
Адрес: Украина, г. Ровно
Пол: Male
Сообщения: 140

yan_kos Известность не заставит себя ждать
2 alexey_ma:
Спасибо! проблема решена
yan_kos вне форума  
Старый 23.05.2006, 16:27     # 8
NetS
::VIP::
 
Аватар для NetS
 
Регистрация: 22.06.2005
Адрес: 45°00' N / 41°55' E 26rus
Пол: Male
Сообщения: 1 331

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

читай правила правила
Удачи!
__________________
"Люблю круглые даты: 16, 32, 64..."
NetS вне форума  


Ваши права в разделе
Вы НЕ можете создавать новые темы
Вы не можете отвечать в темах.
Вы НЕ можете прикреплять вложения
Вы НЕ можете редактировать свои сообщения

BB код Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.

Быстрый переход


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




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