Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / И снова потоки (PostThreadMessge) / 19 сообщений из 19, страница 1 из 1
14.07.2006, 10:56
    #33853221
дед Макар
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
И снова потоки (PostThreadMessge)
Всем привет. Такое дело. В главном модуле есть
Код: 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
14.07.2006, 12:35
    #33853640
MElin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
И снова потоки (PostThreadMessge)
дед МакарВсем привет. Такое дело. В главном модуле есть
int CMyThread::Run()
{
for (int i = 0; i < 10; i++) {
printf("Thread working...\n");
Sleep(500);
}
return 0;
}

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

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

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

Не надо его переопределять, если не хочеш самостоятельно обслуживать очередь сообщений.
...
Рейтинг: 0 / 0
14.07.2006, 13:57
    #33853950
дед Макар
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
И снова потоки (PostThreadMessge)
ага... а вчем же мне тогда выполнять свой алгоритм? (В данном случае for (int i = 0; i < 10; i++) { printf("Thread working...\n"); ...)
...
Рейтинг: 0 / 0
14.07.2006, 14:29
    #33854065
MElin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
И снова потоки (PostThreadMessge)
дед Макарага... а вчем же мне тогда выполнять свой алгоритм? (В данном случае 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
14.07.2006, 14:35
    #33854084
дед Макар
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
И снова потоки (PostThreadMessge)
благодаря 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
14.07.2006, 14:41
    #33854107
дед Макар
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
И снова потоки (PostThreadMessge)
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
14.07.2006, 14:49
    #33854144
MElin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
И снова потоки (PostThreadMessge)
Ага.
то есть таки пункт №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
14.07.2006, 14:55
    #33854173
дед Макар
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
И снова потоки (PostThreadMessge)
получилось вот так

Thread working...
Thread working...
Thread working...
Thread working...
SendMessage
Thread working...
Thread working...
Thread working...
Thread working...
Thread working...
Thread working...
MESSAGE
...
Рейтинг: 0 / 0
14.07.2006, 15:14
    #33854255
MElin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
И снова потоки (PostThreadMessge)
если зочеш, что б поток И считал И обрабатывал сообщения, надо разбить грассчетный алгоритм на кванты. и мессагами их вызывать друг за другом.
привожу тока измененные функции ;-)
Ну и в класс добавить переменную-счетцик :-)
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
14.07.2006, 15:21
    #33854288
дед Макар
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
И снова потоки (PostThreadMessge)
Это не то. Как же объяснить.

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

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

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

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

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

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

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

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

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


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