powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / обновление данных в потоке
9 сообщений из 9, страница 1 из 1
обновление данных в потоке
    #37999327
spyker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет, вот столкнулся вот с такой проблемкой:
сделал так чтобы у синусоиды в потоке обновляются координаты, точнее амплитуда:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
bool stop;
DWORD WINAPI SPEED(LPVOID pParam)
{
		Cgrafic1Dlg *mc=(Cgrafic1Dlg*)pParam;
while(stop==0)
{
		mc->A1+=0.1;
		mc->A2-=0.1;
		//mc->x+=0.1;
		mc->Invalidate();
			Sleep(20);
}
	return 0;
};


поток запускается по кнопке
void Cgrafic1Dlg::MAIN()
{


vector<double>Y(func(A1,A2,A3,w1,w2,w3,phi1,phi2,phi3,nn,Fd,0));
Draw(frameDC,rect,Y);
setka(frameDC,rect);
zoom(Y);
UpdateData(true);


}
void Cgrafic1Dlg::OnBnClickedButton1()
{

Invalidate();
MAIN();
//ofstream fout("2.txt",ios::out);
//int a=0;
hThread=CreateThread(NULL,0,SPEED,this,0,&id);
//ResumeThread(hThread);
WaitForSingleObject(hThread,INFINITE);
CloseHandle(hThread);

}

Завершаю по кнопке
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
void Cgrafic1Dlg::OnBnClickedButton2()
{
	stop=1;
	//DWORD id;
	//HANDLE hThread;
	TerminateThread(hThread,id);
	//UpdateData(TRUE);
	/*Invalidate();
	UpdateData(true);*/
	// TODO: добавьте свой код обработчика уведомлений
}



но когда все мое художество начинает работать, я не могу завершить поток при нажатии кнопки..
потому что экран програмки сильно мерцает, хотя РИСУЮ В ПАМЯТЬ!
Помогите пожалуйста как это исправить?
время SLEEP уменьшал!
...
Рейтинг: 0 / 0
обновление данных в потоке
    #37999343
spyker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
рисую в память так вот:

Код: plaintext
1.
2.
3.
4.
5.
6.
frameWnd=GetDlgItem(IDC_picture);
	frameDC=frameWnd->GetDC();
	frameWnd->GetClientRect(&rect);
	pMemDc.CreateCompatibleDC(frameDC);
	bmp.CreateCompatibleBitmap(frameDC,rect.Width(),rect.Height());
	tmp = pMemDc.SelectObject(&bmp);



а вызываю так:
Код: plaintext
1.
2.
3.
4.
5.
6.
vector<double>Y(func(A1,A2,A3,w1,w2,w3,phi1,phi2,phi3,nn,Fd,0));
	Draw(&pMemDc,rect,Y);
frameDC->BitBlt(0,0,rect.Width(),rect.Height(),&pMemDc,0,0,SRCCOPY);

	setka(&pMemDc,rect);
	frameDC->BitBlt(0,0,rect.Width(),rect.Height(),&pMemDc,0,0,SRCCOPY);
...
Рейтинг: 0 / 0
обновление данных в потоке
    #37999430
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
spyker
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
void Cgrafic1Dlg::OnBnClickedButton1()
{
    ...
    hThread=CreateThread(NULL,0,SPEED,this,0,&id);
    WaitForSingleObject(hThread,INFINITE);
    CloseHandle(hThread);
}


Данный код означает, что функция будет ожидать завершения потока. Так как внутри функции SPEED бесконечный цикл, то ожидание будет бесконечным. Также это означает, что никакие другие сообщения твоя программа обрабатывать не сможет т.к. ты заблокировал поток с циклом обработки сообщений.

Убери вызовы WaitForSingleObject и CloseHandle. Перед созданием потока создай событие (CreateEvent), внутри потока сделай паузы с помощью WaitForSingleObject на созданном событии. Когда нужно завершить поток сигнализируй событие (SetEvent), затем дождись завершения потока с помощью WaitForSingleObject(hThread) и закрывай хендлы потока и события.

Про функцию TerminateThread забудь. Она может привести к сложно отлаживаемым проблемам.

spykerвремя SLEEP уменьшал!
Надеюсь это опечатка и ты хотел сказать "увеличивал"? :)

И, вдогонку, что за странный стиль именования функций в заглавном регистре и использование имени MAIN?
...
Рейтинг: 0 / 0
обновление данных в потоке
    #37999444
spyker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Event пока не добавил, почему TerminateThread(hThread,id); будет приводит к неким проблемам?
строчку с WaitForSingleObject(hThread,INFINITE); закоментил
все работает но мерцание остается
вот как мерцание убрать? нигде InvalidateRect не нужно добавлять?

а main просто вот так написал!
...
Рейтинг: 0 / 0
обновление данных в потоке
    #37999448
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
spykerпочему TerminateThread(hThread,id); будет приводит к неким проблемам?

Почему выстрел в голову будет приводить к неким проблемам?..

Мерцание возникает, поскольку рисуется не только твой битмап, но и фон. Подави перерисовку
фона - исчезнет мерцание.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
обновление данных в потоке
    #37999542
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На MSDN пишут про возможные проблемы использования TerminateThread:

http://msdn.microsoft.com/en-us/library/windows/desktop/ms686717%28v=vs.85%29.aspx
...
Рейтинг: 0 / 0
обновление данных в потоке
    #37999636
m_Sla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
spykerEvent пока не добавил, почему TerminateThread(hThread,id); будет приводит к неким проблемам?
...Про потоки читай Джеффри РИХТЕР "Создание эффективных WIN32-приложений с учетом специфики 64-разрядной версии Windows".
...
Рейтинг: 0 / 0
обновление данных в потоке
    #37999915
Katamaran1987
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
spykerпочему TerminateThread(hThread,id); будет приводит к неким проблемам?

Потому что поток всегда должен закончиться сам, иначе ты получишь UB, в цикле потока должен быть твой флажок хотя бы который ты будешь дергать чтобы сказать что больше поток не нужен, можно поступить как в бусте обернуть в трай кэтч и и кидать туда эксепшн.terminate служит уже когда ты ничего не можешь сделать а поток надо грохнуть, хэндл потока все равно будут висеть.
...
Рейтинг: 0 / 0
обновление данных в потоке
    #38001186
spyker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
увидел что проблема из за pDC->Rectangle, как бы его объявить так чтобы он нарисовался только один раз? это сделать нужно в какой-то функции?
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / обновление данных в потоке
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]