|
|
|
И снова потоки (PostThreadMessge)
|
|||
|---|---|---|---|
|
#18+
Всем привет. Такое дело. В главном модуле есть Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 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. Но почему-то функция OnMessage не вызывается. Что не так? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2006, 10:56 |
|
||
|
И снова потоки (PostThreadMessge)
|
|||
|---|---|---|---|
|
#18+
дед МакарВсем привет. Такое дело. В главном модуле есть int CMyThread::Run() { for (int i = 0; i < 10; i++) { printf("Thread working...\n"); Sleep(500); } return 0; } [/src] Но почему-то функция OnMessage не вызывается. Что не так? От, а как он будет получать соообщения, если ты Run переопределил так, что мессейдж пампа нет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2006, 12:35 |
|
||
|
И снова потоки (PostThreadMessge)
|
|||
|---|---|---|---|
|
#18+
а как его тогда правильно переопределить? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2006, 12:42 |
|
||
|
И снова потоки (PostThreadMessge)
|
|||
|---|---|---|---|
|
#18+
дед Макара как его тогда правильно переопределить? А никак ;-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2006, 12:45 |
|
||
|
И снова потоки (PostThreadMessge)
|
|||
|---|---|---|---|
|
#18+
MElin дед Макара как его тогда правильно переопределить? А никак ;-) в смысле переопределять не обязательно. Ну или ,как вариант while ( !GetMessage() ) { TranslateMessage(); DispatchMessage(); } ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2006, 12:48 |
|
||
|
И снова потоки (PostThreadMessge)
|
|||
|---|---|---|---|
|
#18+
О как... А нахрена тогда там карта сообщений? пережиток прошлого? (???) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2006, 12:55 |
|
||
|
И снова потоки (PostThreadMessge)
|
|||
|---|---|---|---|
|
#18+
дед МакарО как... А нахрена тогда там карта сообщений? пережиток прошлого? (???) поддержку ее как раз и реализует СТАНДАРТНЫЙ Run. Не надо его переопределять, если не хочеш самостоятельно обслуживать очередь сообщений. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2006, 13:02 |
|
||
|
И снова потоки (PostThreadMessge)
|
|||
|---|---|---|---|
|
#18+
ага... а вчем же мне тогда выполнять свой алгоритм? (В данном случае for (int i = 0; i < 10; i++) { printf("Thread working...\n"); ...) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2006, 13:57 |
|
||
|
И снова потоки (PostThreadMessge)
|
|||
|---|---|---|---|
|
#18+
дед Макарага... а вчем же мне тогда выполнять свой алгоритм? (В данном случае 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; } ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2006, 14:29 |
|
||
|
И снова потоки (PostThreadMessge)
|
|||
|---|---|---|---|
|
#18+
благодаря MElin пришел вот к чему Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. а в главном модуле Код: plaintext 1. 2. 3. 4. 5. 6. 7. Но, ессесно, сначала полностью выполняется Func() и только потом срабатывает OnMessage. Что добавить в функцию Func(), что бы все работало как надо? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2006, 14:35 |
|
||
|
И снова потоки (PostThreadMessge)
|
|||
|---|---|---|---|
|
#18+
MElin Дык вам чего надобно? :-) шашечки или ехать? ;-) Ехать. Но так, что бы по дороге не рассыпаться. Что мне нужно. Есть поток. В нем выполняется какая-то обработка которая, скажем условно, длится два часа. мне нужно в этот поток посылать сообщения, и поток будет либо выполнять еще какие-то действия, либо останавливаться совсем. А в моем приведенном примере хочу добиться вот такого вывода Thread working.... Thread working.... Thread working.... Thread working.... Send message MESSAGE Thread working.... Thread working.... Thread working.... Thread working.... Thread working.... Thread working.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2006, 14:41 |
|
||
|
И снова потоки (PostThreadMessge)
|
|||
|---|---|---|---|
|
#18+
Ага. то есть таки пункт №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"); } ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2006, 14:49 |
|
||
|
И снова потоки (PostThreadMessge)
|
|||
|---|---|---|---|
|
#18+
получилось вот так Thread working... Thread working... Thread working... Thread working... SendMessage Thread working... Thread working... Thread working... Thread working... Thread working... Thread working... MESSAGE ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2006, 14:55 |
|
||
|
И снова потоки (PostThreadMessge)
|
|||
|---|---|---|---|
|
#18+
если зочеш, что б поток И считал И обрабатывал сообщения, надо разбить грассчетный алгоритм на кванты. и мессагами их вызывать друг за другом. привожу тока измененные функции ;-) Ну и в класс добавить переменную-счетцик :-) 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; } ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2006, 15:14 |
|
||
|
И снова потоки (PostThreadMessge)
|
|||
|---|---|---|---|
|
#18+
Это не то. Как же объяснить. Есть поток. В нем в [условно-]бесконечном цикле происходит запись данных в файл. Но в какой-то момент (абсолютно неизвестный) может прийти сообщение - "остановить запись в файл, вывести две страницы на принтер, и продолжить писать." Или "перестать писать в этот файл, и начать писать в другой". Как? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2006, 15:21 |
|
||
|
И снова потоки (PostThreadMessge)
|
|||
|---|---|---|---|
|
#18+
Но повторюсь, считать в потоке нечно большое и мессаги получать в нем же - моветон ;-) есть много более других интиресных способов обмениваться информацией. переменную, скажем, обрамить CCriticalSection или CEvent, CMutex - от наворотов дальнейших зависит ;-) ну и в рассчетном цикле, ее регулярно опрашивать, предварительно залочив секцию. Разлачивая тут же. В главном потоке - опять же залочив ее предварительно, можно туда чота писать ;-) Разом оверхеад уменьшаецца раза в 4 ;-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2006, 15:22 |
|
||
|
И снова потоки (PostThreadMessge)
|
|||
|---|---|---|---|
|
#18+
дед МакарЭто не то. Как же объяснить. Есть поток. В нем в [условно-]бесконечном цикле происходит запись данных в файл. Но в какой-то момент (абсолютно неизвестный) может прийти сообщение - "остановить запись в файл, вывести две страницы на принтер, и продолжить писать." Или "перестать писать в этот файл, и начать писать в другой". Как? ну а это чем не условно бесконечный? ;-) int CMyThread::OnMyCoolRun(WPARAM, LPARAM) { sleep(500); printf("Thread working...\n"); PostThreadMessage( WM_USER + 6, NULL, NULL); return 0; } Вместа цикла for - обработик сам себя вызывает. Чем не цыкл? ;-) только повторюсь - моветон это :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2006, 15:25 |
|
||
|
И снова потоки (PostThreadMessge)
|
|||
|---|---|---|---|
|
#18+
Сделал. Вот так Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. Только через карту сообщений можно сделать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2006, 15:31 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=33853640&tid=2030837]: |
0ms |
get settings: |
6ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
142ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
36ms |
get tp. blocked users: |
1ms |
| others: | 201ms |
| total: | 413ms |

| 0 / 0 |
