|
|
|
Проблемы организации многпоточного кода
|
|||
|---|---|---|---|
|
#18+
Добрый день. Проблемма такая, даже незнаю с кокого конца начинать. Пишу программу, точнее уже написал, все работает отлично. Непонравилось лишь одно, в одном месте программы начинается цикл в процессе этого цикла многое происходит в том числе и вывод результатов хода выполнения в ListBox, все бы ничего результаты выводятся но окно подвисает то есть полоса прокрутки становися нерабочей пока цикл неотработает. Вот тут я подумал и решил в месте возникновения цикла организовать новый поток. И вот тут начались мои кошмары. Дело в том что с потоками я до этого не заморачивался, порылся почитал что то уловил что нет ) Вобщем код такой пишу на VC++ 6.0 в месте возниконовения цикла теперь стоит это hThread = CreateThread( NULL,0,ClientThread,(LPVOID)(¶ms),0,&dwThreadId); params это структура она определена чуть выше ее суть заключается в передаче параметров которые необходимы для работы цикла, там есть и составные типы данных и обыкновенные переменные DataParams* params; ClientThread это собсвенно цикл. Так вот когда я пытаюсь заполнить структуру выдается ошибка. Собственно вопрос, где необходимо определить структуру, в самом классе или можно в любом месте, и где необходимо определить переменную от структуры опять же в классе или в теле функции где будет заполняться структура ? Или может кто то уже с этим сталкивался и может посоветовать алгоритм действий. Заранее благодарен Максим Заикин. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2006, 15:58 |
|
||
|
Проблемы организации многпоточного кода
|
|||
|---|---|---|---|
|
#18+
User Interface Threads The MFC library provides good support for UI threads. You derive a class from CWinThread, and you use an overloaded version of AfxBeginThread to start the thread. Your derived CWinThread class has its own InitInstance function, and most important, it has its own message loop. You can construct windows and map messages as required. Why might you want a user interface thread? If you want multiple top-level windows, you can create and manage them from your main thread. Suppose you allow the user to run multiple instances of your application, but you want all instances to share memory. You can configure a single process to run multiple UI threads such that users think they are running separate processes. That's exactly what Windows Explorer does. Check it out with SPY++. Starting the second and subsequent threads is a little tricky because the user actually launches a new process for each copy of Windows Explorer. When the second process starts, it signals the first process to start a new thread, and then it exits. The second process can locate the first process either by calling the Win32 FindWindow function or by declaring a shared data section. Shared data sections are explained in detail in Jeffrey Richter's book. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2006, 16:06 |
|
||
|
Проблемы организации многпоточного кода
|
|||
|---|---|---|---|
|
#18+
Странно ) Непомогло ) Но все равно спасибо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2006, 16:09 |
|
||
|
Проблемы организации многпоточного кода
|
|||
|---|---|---|---|
|
#18+
Ползуеш сообщение WM_SETREDRAW? Если нет, попробуй. Можно ускорить процес (без наличие второго потока). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2006, 16:39 |
|
||
|
Проблемы организации многпоточного кода
|
|||
|---|---|---|---|
|
#18+
MaximZaikin hThread = CreateThread( NULL,0,ClientThread,(LPVOID)(¶ms),0,&dwThreadId); params это структура она определена чуть выше ее суть заключается в передаче параметров которые необходимы для работы цикла, там есть и составные типы данных и обыкновенные переменные DataParams* params; если DataParams* params; тогда создание потока будет hThread = CreateThread( NULL,0,ClientThread,(LPVOID)(params),0,&dwThreadId); А вы где-нить выделяете память под params. Я тоже парился несколько дней назад с потоками, а именно AfxBeginThread, у меня все получилось. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2006, 16:40 |
|
||
|
Проблемы организации многпоточного кода
|
|||
|---|---|---|---|
|
#18+
MaximZaikin.....Так вот когда я пытаюсь заполнить структуру выдается ошибка.Собственно вопрос, где необходимо определить структуру, в самом классе или можно в любом месте, и где необходимо определить переменную от структуры опять же в классе или в теле функции где будет заполняться структура ? Или может кто то уже с этим сталкивался и может посоветовать алгоритм действий.... 1) как тут писалось выше - рулит книга Рихтера "Windows для проффесионалов". Там разжовано по сути с примерами данная тема (многопоточность). 2) если у Вас выдаёться ошибка в месте заполнения структуры, то енто значит не совсем уж много вещей...а) не правильный указатель, указывающий на деревню бабушки и сработка защиты (как правило) - как следствие.б) не проинициализирован данный указатель... 3) создание потока - это апи функционал. классы там превращаются в указатели на функцию, либо куски кода классов.... 4) при запуске потоков необходимо ОБЯЗАТЕЛЬНО отслеживать СИНХРОННЫЕ фазы запуска и останова. Очень актуально при времени жизни программы больше чем поделка "хэйллохты мир". Проявляется как правило при ударных нагрузках на данную систему и комп в частности. 5) при передачи данных между потоками - использовать синхронизирующие, атомарные обьекты ядра (см. Рихтера). с уважением (круглый) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2006, 16:45 |
|
||
|
Проблемы организации многпоточного кода
|
|||
|---|---|---|---|
|
#18+
2 Agent007 Нет я используй UpdateWindow(); 2 a shar А как же. В функции где стартует поток вот таким вот макаром DataParams* params; Что значит AfxBeginThread я такую неиспользую ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2006, 16:45 |
|
||
|
Проблемы организации многпоточного кода
|
|||
|---|---|---|---|
|
#18+
Товарищ круглый, спасибо за рекомендацию, пойду гляну что там про многопоточность. Но все же вопрос актуален, если есть советы делитесь, тему надо добить сам если узнаю в чем проблемма опишу все нюансы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2006, 16:51 |
|
||
|
Проблемы организации многпоточного кода
|
|||
|---|---|---|---|
|
#18+
MaximZaikin2 Agent007 Нет я используй UpdateWindow(); 2 a shar А как же. В функции где стартует поток вот таким вот макаром DataParams* params; Что значит AfxBeginThread я такую неиспользую ) Не смейся над агентом - он из болгарии, а там язык хоть и славянский, но спряжений и падежей нет. По поводу топика - не тащи в GUI многопоточность из-за одного метода. Используй асинхронный IO, или еще чего. Win32 имеет средства для совершения длительных операций в рамках однопоточного GUI. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2006, 16:58 |
|
||
|
Проблемы организации многпоточного кода
|
|||
|---|---|---|---|
|
#18+
Да это просто опечатка ) Да в том то и дело что рано или поздно а программу это придется переводить в многопоточность. Кстати никто незнает где Рихтера кучнуть можно ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2006, 17:06 |
|
||
|
Проблемы организации многпоточного кода
|
|||
|---|---|---|---|
|
#18+
Могу рихтера на мыло скинуть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2006, 17:11 |
|
||
|
Проблемы организации многпоточного кода
|
|||
|---|---|---|---|
|
#18+
a_sharМогу рихтера на мыло скинуть. и мне, если не сложно, спасибо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2006, 17:13 |
|
||
|
Проблемы организации многпоточного кода
|
|||
|---|---|---|---|
|
#18+
MaximZaikinДа в том то и дело что рано или поздно а программу это придется переводить в многопоточность. Кстати никто незнает где Рихтера кучнуть можно ? Сначала доделай первую версию программы, тебе остается только пофиксить медленную перерисовку во время тяжелого цикла. Переделывай потом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2006, 17:15 |
|
||
|
Проблемы организации многпоточного кода
|
|||
|---|---|---|---|
|
#18+
Сергей ИльичПо поводу топика - не тащи в GUI многопоточность из-за одного метода. Используй асинхронный IO, или еще чего. Win32 имеет средства для совершения длительных операций в рамках однопоточного GUI. Присоединяюсь. Несколько потоков лучше использовать для ускорения некоторых фоновых процессов обработки.(Вот, например, твой цикл разбить на два отдельных подцикла, каждый из которых обрабатывает свою порцию данных в отдельном потоке , если, конечно это нужно). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2006, 17:17 |
|
||
|
Проблемы организации многпоточного кода
|
|||
|---|---|---|---|
|
#18+
Товарищ Круглый киньте пожалуйста буду признателен. Да готова первая версия сообщения выводятся одно за одним в ту же секунду как оно готово, а вот полоса прокрутки виснет, то есть я не могу глянуть что там ниже за сообщения выходят ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2006, 17:17 |
|
||
|
Проблемы организации многпоточного кода
|
|||
|---|---|---|---|
|
#18+
Нет цикл бить на потоки это будет лишним, а вот закинуть его в отдельный поток самое то ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2006, 17:19 |
|
||
|
Проблемы организации многпоточного кода
|
|||
|---|---|---|---|
|
#18+
MaximZaikinТоварищ Круглый киньте пожалуйста буду признателен. Да готова первая версия сообщения выводятся одно за одним в ту же секунду как оно готово, а вот полоса прокрутки виснет, то есть я не могу глянуть что там ниже за сообщения выходят ) почему бы не использовать, выделение вновь добавленного айтема, по моему это автоматически передвинет полосу прокрутки? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2006, 17:20 |
|
||
|
Проблемы организации многпоточного кода
|
|||
|---|---|---|---|
|
#18+
Хорошо как вариант принимается. Но так же замирают все кнопки на форме ни одна не работает пока цикл не отработает ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2006, 17:23 |
|
||
|
Проблемы организации многпоточного кода
|
|||
|---|---|---|---|
|
#18+
Вынеси такие длительные операции в отдельную DLL. Там их делай в контексте отдельного треда. Оттуда сообщай основному приложению о ходе процесса с помощью посылки сообщений в окно (PostMessage). Соответственно, методы экспортируемые из DLL должны принимать HWND окна и идентификатор сообщения, который они туда будет посылать по ходу процесса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2006, 17:36 |
|
||
|
Проблемы организации многпоточного кода
|
|||
|---|---|---|---|
|
#18+
Хороший совет. Я даже им попытаюсь восползоваться если смогу их вынести в dll, а посему прошу дайте кто нибудь хорошую доку по этому вопросу. Я так понимаю в книге Рихтера все это имеется, прошу выслать на wasihw@mail.ru буду очень признателен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2006, 17:46 |
|
||
|
Проблемы организации многпоточного кода
|
|||
|---|---|---|---|
|
#18+
Все получил спасибо большое ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2006, 17:50 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=33635765&tid=2031644]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
52ms |
get topic data: |
9ms |
get forum data: |
3ms |
get page messages: |
56ms |
get tp. blocked users: |
1ms |
| others: | 231ms |
| total: | 381ms |

| 0 / 0 |
