powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / И снова потоки (PostThreadMessge)
19 сообщений из 19, страница 1 из 1
И снова потоки (PostThreadMessge)
    #33853221
дед Макар
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет. Такое дело. В главном модуле есть
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
#include "MyThread.h"
...

		CMyThread *thrd;
		thrd = (CMyThread *)AfxBeginThread(RUNTIME_CLASS(CMyThread), THREAD_PRIORITY_NORMAL,  0 ,  0 );
		Sleep( 2000 );
		printf("SendMessage\n");
		thrd->PostThreadMessage(WM_USER +  5 , NULL, NULL);


CMyThread описан в MyThread.cpp как

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
IMPLEMENT_DYNCREATE(CMyThread, CWinThread)

CMyThread::CMyThread()
{
}

CMyThread::~CMyThread()
{
}

BOOL CMyThread::InitInstance()
{
	return TRUE;
}

int CMyThread::ExitInstance()
{
	return CWinThread::ExitInstance();
}

BEGIN_MESSAGE_MAP(CMyThread, CWinThread)
	ON_THREAD_MESSAGE(WM_USER +  5 , OnMessage)
END_MESSAGE_MAP()

int CMyThread::Run()
{
	for (int i =  0 ; i <  10 ; i++) {
		printf("Thread working...\n");
		Sleep( 500 );
	}
	return  0 ;
}

void CMyThread::OnMessage(WPARAM, LPARAM)
{
	printf("MESSAGE\n");
}

Но почему-то функция OnMessage не вызывается. Что не так?
...
Рейтинг: 0 / 0
И снова потоки (PostThreadMessge)
    #33853640
MElin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
дед МакарВсем привет. Такое дело. В главном модуле есть
int CMyThread::Run()
{
for (int i = 0; i < 10; i++) {
printf("Thread working...\n");
Sleep(500);
}
return 0;
}

[/src]
Но почему-то функция OnMessage не вызывается. Что не так?
От, а как он будет получать соообщения, если ты Run переопределил так, что мессейдж пампа нет?
...
Рейтинг: 0 / 0
И снова потоки (PostThreadMessge)
    #33853661
дед Макар
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а как его тогда правильно переопределить?
...
Рейтинг: 0 / 0
И снова потоки (PostThreadMessge)
    #33853673
MElin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
дед Макара как его тогда правильно переопределить?
А никак ;-)
...
Рейтинг: 0 / 0
И снова потоки (PostThreadMessge)
    #33853685
MElin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MElin дед Макара как его тогда правильно переопределить?
А никак ;-)
в смысле переопределять не обязательно.
Ну или ,как вариант

while ( !GetMessage() )
{
TranslateMessage();
DispatchMessage();
}
...
Рейтинг: 0 / 0
И снова потоки (PostThreadMessge)
    #33853715
дед Макар
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
О как... А нахрена тогда там карта сообщений? пережиток прошлого? (???)
...
Рейтинг: 0 / 0
И снова потоки (PostThreadMessge)
    #33853738
MElin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
дед МакарО как... А нахрена тогда там карта сообщений? пережиток прошлого? (???)

поддержку ее как раз и реализует СТАНДАРТНЫЙ Run.

Не надо его переопределять, если не хочеш самостоятельно обслуживать очередь сообщений.
...
Рейтинг: 0 / 0
И снова потоки (PostThreadMessge)
    #33853950
дед Макар
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ага... а вчем же мне тогда выполнять свой алгоритм? (В данном случае for (int i = 0; i < 10; i++) { printf("Thread working...\n"); ...)
...
Рейтинг: 0 / 0
И снова потоки (PostThreadMessge)
    #33854065
MElin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
дед Макарага... а вчем же мне тогда выполнять свой алгоритм? (В данном случае for (int i = 0; i < 10; i++) { printf("Thread working...\n"); ...)

Дык вам чего надобно? :-) шашечки или ехать? ;-)
в смысле, если надо РАБОЧУЮ нить, счетный алгоритм, тогда лучше воспользоваться другим способом:
CWinThread *thrd;
thrd = (CMyThread *)AfxBeginThread(MyCooolAlgoritm);

UINT MyCooolAlgoritm(LPVOID)
{
for (int i = 0; i < 10; i++) {
printf("Thread working...\n");
Sleep(500);
}
return 0;

}

Если нужно ловить мессаги, и в случае их получения выполнять на их какие т действия - то эт уже почти ваш пример, тока без Run(), а, скажем как то так:
#define MY_SUPER_COOOL_RUN_MESSAGE WM_USER + 6

BEGIN_MESSAGE_MAP(CMyThread, CWinThread)
ON_THREAD_MESSAGE(WM_USER + 5, OnMessage)
ON_THREAD_MESSAGE(MY_SUPER_COOOL_RUN_MESSAGE, MyCooolAlgoritm)
END_MESSAGE_MAP()


UINT CMyThread::MyCooolAlgoritm(WPARAM, LPARAM)
{
for (int i = 0; i < 10; i++) {
printf("Thread working...\n");
Sleep(500);
}
return 0;

}
...
Рейтинг: 0 / 0
И снова потоки (PostThreadMessge)
    #33854084
дед Макар
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
благодаря MElin пришел вот к чему
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
BEGIN_MESSAGE_MAP(CMyThread, CWinThread)
	ON_THREAD_MESSAGE(WM_USER +  5 , OnMessage)
END_MESSAGE_MAP()

void CMyThread::OnMessage(WPARAM, LPARAM)
{
	printf("MESSAGE\n");
}

void CMyThread::Func()
{
	MSG message;
	for (int i =  0 ; i <  10 ; i++) {
		printf("Thread working...\n");
		Sleep( 500 );
//Что вставить сюда, что бы проверялись сообщения?
	}
}

а в главном модуле
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
CMyThread *thrd;
		thrd = (CMyThread *)AfxBeginThread(RUNTIME_CLASS(CMyThread), THREAD_PRIORITY_NORMAL,  0 ,  0 );
		thrd->Func();

		Sleep( 2000 );
		printf("SendMessage\n");
		thrd->PostThreadMessage(WM_USER +  5 , NULL, NULL);

Но, ессесно, сначала полностью выполняется Func() и только потом срабатывает OnMessage. Что добавить в функцию Func(), что бы все работало как надо?
...
Рейтинг: 0 / 0
И снова потоки (PostThreadMessge)
    #33854107
дед Макар
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MElin
Дык вам чего надобно? :-) шашечки или ехать? ;-)

Ехать. Но так, что бы по дороге не рассыпаться.

Что мне нужно. Есть поток. В нем выполняется какая-то обработка которая, скажем условно, длится два часа. мне нужно в этот поток посылать сообщения, и поток будет либо выполнять еще какие-то действия, либо останавливаться совсем.

А в моем приведенном примере хочу добиться вот такого вывода

Thread working....
Thread working....
Thread working....
Thread working....
Send message
MESSAGE
Thread working....
Thread working....
Thread working....
Thread working....
Thread working....
Thread working....
...
Рейтинг: 0 / 0
И снова потоки (PostThreadMessge)
    #33854144
MElin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ага.
то есть таки пункт №2 ;-)

главный модуль:

#include "MyThread.h"
...

CMyThread *thrd;
thrd = (CMyThread *)AfxBeginThread(RUNTIME_CLASS(CMyThread), THREAD_PRIORITY_NORMAL, 0, 0);
Sleep(2000);
printf("SendMessage\n");
thrd->PostThreadMessage(WM_USER + 5, NULL, NULL);


а вот и модуль:
e
IMPLEMENT_DYNCREATE(CMyThread, CWinThread)

CMyThread::CMyThread()
{
}

CMyThread::~CMyThread()
{
}

BOOL CMyThread::InitInstance()
{
PostThreadMessage( WM_USER + 6, NULL, NULL);
return TRUE;
}

int CMyThread::ExitInstance()
{
return CWinThread::ExitInstance();
}

BEGIN_MESSAGE_MAP(CMyThread, CWinThread)
ON_THREAD_MESSAGE(WM_USER + 5, OnMessage)
ON_THREAD_MESSAGE(WM_USER + 6, OnMyCoolRun)
END_MESSAGE_MAP()

int CMyThread::OnMyCoolRun(WPARAM, LPARAM)
{
for (int i = 0; i < 10; i++) {
printf("Thread working...\n");
Sleep(500);
}
return 0;
}

void CMyThread::OnMessage(WPARAM, LPARAM)
{
printf("MESSAGE\n");
}
...
Рейтинг: 0 / 0
И снова потоки (PostThreadMessge)
    #33854173
дед Макар
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
получилось вот так

Thread working...
Thread working...
Thread working...
Thread working...
SendMessage
Thread working...
Thread working...
Thread working...
Thread working...
Thread working...
Thread working...
MESSAGE
...
Рейтинг: 0 / 0
И снова потоки (PostThreadMessge)
    #33854255
MElin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если зочеш, что б поток И считал И обрабатывал сообщения, надо разбить грассчетный алгоритм на кванты. и мессагами их вызывать друг за другом.
привожу тока измененные функции ;-)
Ну и в класс добавить переменную-счетцик :-)
int m_iCounter;


BOOL CMyThread::InitInstance()
{
m_iCounter = 0;
PostThreadMessage( WM_USER + 6, NULL, NULL);
return TRUE;
}

int CMyThread::OnMyCoolRun(WPARAM, LPARAM)
{
if( m_iCounter++ < 10 )
{
sleep(500);
printf("Thread working...\n");
PostThreadMessage( WM_USER + 6, NULL, NULL);
}
return 0;
}
...
Рейтинг: 0 / 0
И снова потоки (PostThreadMessge)
    #33854288
дед Макар
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Это не то. Как же объяснить.

Есть поток. В нем в [условно-]бесконечном цикле происходит запись данных в файл. Но в какой-то момент (абсолютно неизвестный) может прийти сообщение - "остановить запись в файл, вывести две страницы на принтер, и продолжить писать." Или "перестать писать в этот файл, и начать писать в другой".

Как?
...
Рейтинг: 0 / 0
И снова потоки (PostThreadMessge)
    #33854295
MElin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Но повторюсь, считать в потоке нечно большое и мессаги получать в нем же - моветон ;-)
есть много более других интиресных способов обмениваться информацией.
переменную, скажем, обрамить CCriticalSection или CEvent, CMutex - от наворотов дальнейших зависит ;-)

ну и в рассчетном цикле, ее регулярно опрашивать, предварительно залочив секцию. Разлачивая тут же.

В главном потоке - опять же залочив ее предварительно, можно туда чота писать ;-)

Разом оверхеад уменьшаецца раза в 4 ;-)
...
Рейтинг: 0 / 0
И снова потоки (PostThreadMessge)
    #33854318
MElin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
дед МакарЭто не то. Как же объяснить.

Есть поток. В нем в [условно-]бесконечном цикле происходит запись данных в файл. Но в какой-то момент (абсолютно неизвестный) может прийти сообщение - "остановить запись в файл, вывести две страницы на принтер, и продолжить писать." Или "перестать писать в этот файл, и начать писать в другой".

Как?
ну а это чем не условно бесконечный? ;-)
int CMyThread::OnMyCoolRun(WPARAM, LPARAM)
{
sleep(500);
printf("Thread working...\n");
PostThreadMessage( WM_USER + 6, NULL, NULL);
return 0;
}

Вместа цикла for - обработик сам себя вызывает. Чем не цыкл? ;-)
только повторюсь - моветон это :-)
...
Рейтинг: 0 / 0
И снова потоки (PostThreadMessge)
    #33854345
дед Макар
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сделал. Вот так

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
int CMyThread::Run()
{
	for (int i =  0 ; i <  10 ; i++) {
		MSG message;
		if (::PeekMessage(&message, NULL,  0 ,  0 , PM_REMOVE)) {
			::TranslateMessage(&message);
			::DispatchMessage(&message);
			if (message.message == WM_USER +  5 )
				OnMessage(NULL, NULL);
		}
		printf("Thread working...\n");
		Sleep( 500 );
	}
	return  0 ;
}

Только через карту сообщений можно сделать?
...
Рейтинг: 0 / 0
И снова потоки (PostThreadMessge)
    #33854369
MElin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПОсмотреть, как там в стандартном Ranе МФЦ сообщения реализует ;-)
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / И снова потоки (PostThreadMessge)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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