Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
42 / 42 / 4
Регистрация: 14.09.2008
Сообщений: 683
1

Рисовать в окне из другого потока

14.02.2011, 21:15. Просмотров 1464. Ответов 4
Метки нет (Все метки)

Добрый день, написал был код, все работало, но из-за сбоев электрики комп. отключился от сети и как раз мой код оно потерло. Начал восстанавливать и наткнулся на проблемку.
При создании главного окна в WM_CREATE создается поток, который крутится в цикле изменяя данные, но это не главное, в этот поток я посылаю хэндл окна после чего беру из него контекст устройства и вывожу на главное окно текст.
Когда писал в первые все работало, все выводило, сейчас через отладчик смотрю, все переменные инициализированы верно, но текст не выводится и я не могу понять почему?!
Код
int WINAPI Thr1(void *l)
{
	RECT r;
	r.left=r.top = 0;
	r.right=r.bottom=500;

	HWND hwnd = (HWND)l;
	HDC dc = GetDC(hwnd);
	TextOut(dc, 0,300, "Thread1", 7);
	ReleaseDC(hwnd, dc);
	return 0;
}


		case WM_CREATE:
		{
			DWORD id;
			CreateThread(0,0,(LPTHREAD_START_ROUTINE)&Thr1, hwnd, 0, &id);
			break;
		}
		case WM_PAINT:
		{
			PAINTSTRUCT ps;
			ZeroMemory(&ps, sizeof(ps));
			HDC dc = BeginPaint(hwnd, &ps);
			for(int i=0; i<5; i++)
			{
				char str[3];
				itoa(arr[i], str, 10);
				TextOut(dc, 200+(i*15),300, str, strlen(str));
			}
			EndPaint(hwnd, &ps);
			break;
		}
Что я упускаю?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.02.2011, 21:15
Ответы с готовыми решениями:

Как изменить контрол в окне из другого потока
Тема заезжена, но за пару дней я так и не нашел ответа. И в WPF и в потоках я новичок, поэтому...

По нажатию на кнопку из другого потока, нужно чтобы 2 потока останавливались
Есть 2 потока, в которых в цикле выполняется метод Thread.sleep(200); По нажатию на кнопку из...

Как из одного потока узнать состояние другого потока
Подскажите пожалуйста, как из одного потока узнать, что другой поток еще не запущен. Например,...

Вызывть метод одного потока из другого потока
Здравствуйте, подскажите пожалуйста, как можно реализовать такую штуку : есть один поток(1),...

4
1662 / 1131 / 80
Регистрация: 21.08.2008
Сообщений: 4,725
Записей в блоге: 1
14.02.2011, 21:27 2
О 5 25....
Нельзя управлять ГУЕм из дочерних потоков напрямую, через сообщения надо (SendMessage/PostMessage) а в главном потоке их обрабатывать и выводить у де в нем.
ЗЫ: поиск по форуму даст много результатов
0
42 / 42 / 4
Регистрация: 14.09.2008
Сообщений: 683
14.02.2011, 21:34  [ТС] 3
Как это нет, если я писал и все работало, из функции потока я выводил текст "Поток 1\2" и инвалидил область, в результате работы двух потоков, оно поочередно выполняло их и выводило текст какой поток в данном случае работает.
Я понимаю, что в данной ситуации глупо говорить, что "я писал, оно работало" т.к. кода нет сейчас, но относительно меня, я же помню, что писал.
0
1662 / 1131 / 80
Регистрация: 21.08.2008
Сообщений: 4,725
Записей в блоге: 1
14.02.2011, 21:45 4
В таком случае работать будет, но будут глюки,при чем трудноуловимые, т.к. дочерний поток со своей перерисовкой вмешивается в главный поток. Они в большинстве случаев не будут одномеоментно пересекаться, но очень даже возможны случаи, когда они вдвоем получат доступ к одному и тому же объету, и тогда будет швах. В общем нельзя так делать, я гарантирую это.
0
42 / 42 / 4
Регистрация: 14.09.2008
Сообщений: 683
14.02.2011, 21:51  [ТС] 5
За информацию спасибо, я не знал, что нельзя работать с ГУИ из левых процессов. Теперь буду знать, ну а собственно на счет кода, я добавил Инвалидацию окна и стало выводить.
Код
	while(1)
	{
		//EnterCriticalSection( &cs );
		TextOut(dc, 200,200, "Thread1", 7);
		for(int i=0; i<5; i++)
		{
			if( arr[i] + 1 < 100 )
				++arr[i];
			else
				arr[i] = 0;
			InvalidateRect(hwnd,&r ,true);
			Sleep(500);
		}
	//LeaveCriticalSection( &cs );
	}
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.02.2011, 21:51

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Управление объектами потока из другого потока
Доброго времени. Есть два потока, один GUI, второй рабочий - делает снапшоты открытых окон,...

Можно ли рисовать в окне нажатием кнопки?
Попытался осуществить таким образом: case WM_COMMAND: { switch(LOWORD(wParam))...

Приложение позволяющее рисовать в чужом окне
Создать приложение которое позволит рисовать в чужом окне. Не обязательно чтобы было полноценное...

Место в графическом окне, где можно рисовать и создавать обьекты
хочу чтобы в графическом окне было место ,где отображается все фигуры, линии и т.п . Как это...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.