Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Проблемы организации многпоточного кода / 22 сообщений из 22, страница 1 из 1
30.03.2006, 15:58
    #33635563
MaximZaikin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы организации многпоточного кода
Добрый день. Проблемма такая, даже незнаю с кокого конца начинать.
Пишу программу, точнее уже написал, все работает отлично. Непонравилось лишь одно, в одном месте программы начинается цикл в процессе этого цикла многое происходит в том числе и вывод результатов хода выполнения в ListBox, все бы ничего результаты выводятся но окно подвисает то есть полоса прокрутки становися нерабочей пока цикл неотработает. Вот тут я подумал и решил в месте возникновения цикла организовать новый поток. И вот тут начались мои кошмары. Дело в том что с потоками я до этого не заморачивался, порылся почитал что то уловил что нет ) Вобщем код такой пишу на VC++ 6.0
в месте возниконовения цикла теперь стоит это
hThread = CreateThread( NULL,0,ClientThread,(LPVOID)(&params),0,&dwThreadId);
params это структура она определена чуть выше ее суть заключается в передаче параметров которые необходимы для работы цикла, там есть и составные типы данных и обыкновенные переменные
DataParams* params;
ClientThread это собсвенно цикл.
Так вот когда я пытаюсь заполнить структуру выдается ошибка.
Собственно вопрос, где необходимо определить структуру, в самом классе или можно в любом месте, и где необходимо определить переменную от структуры опять же в классе или в теле функции где будет заполняться структура ? Или может кто то уже с этим сталкивался и может посоветовать алгоритм действий.
Заранее благодарен Максим Заикин.
...
Рейтинг: 0 / 0
30.03.2006, 16:06
    #33635599
Cerebrum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы организации многпоточного кода
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.
...
Рейтинг: 0 / 0
30.03.2006, 16:09
    #33635609
MaximZaikin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы организации многпоточного кода
Странно ) Непомогло ) Но все равно спасибо
...
Рейтинг: 0 / 0
30.03.2006, 16:39
    #33635720
Agent 007
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы организации многпоточного кода
Ползуеш сообщение WM_SETREDRAW? Если нет, попробуй. Можно ускорить процес (без наличие второго потока).
...
Рейтинг: 0 / 0
30.03.2006, 16:40
    #33635725
a_shar
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы организации многпоточного кода
MaximZaikin
hThread = CreateThread( NULL,0,ClientThread,(LPVOID)(&params),0,&dwThreadId);
params это структура она определена чуть выше ее суть заключается в передаче параметров которые необходимы для работы цикла, там есть и составные типы данных и обыкновенные переменные
DataParams* params;

если DataParams* params; тогда создание потока будет hThread = CreateThread( NULL,0,ClientThread,(LPVOID)(params),0,&dwThreadId);
А вы где-нить выделяете память под params. Я тоже парился несколько дней назад с потоками, а именно AfxBeginThread, у меня все получилось.
...
Рейтинг: 0 / 0
30.03.2006, 16:45
    #33635742
kolobok0
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы организации многпоточного кода
MaximZaikin.....Так вот когда я пытаюсь заполнить структуру выдается ошибка.Собственно вопрос, где необходимо определить структуру, в самом классе или можно в любом месте, и где необходимо определить переменную от структуры опять же в классе или в теле функции где будет заполняться структура ? Или может кто то уже с этим сталкивался и может посоветовать алгоритм действий....

1) как тут писалось выше - рулит книга Рихтера "Windows для проффесионалов". Там разжовано по сути с примерами данная тема (многопоточность).

2) если у Вас выдаёться ошибка в месте заполнения структуры, то енто значит не совсем уж много вещей...а) не правильный указатель, указывающий на деревню бабушки и сработка защиты (как правило) - как следствие.б) не проинициализирован данный указатель...

3) создание потока - это апи функционал. классы там превращаются в указатели на функцию, либо куски кода классов....

4) при запуске потоков необходимо ОБЯЗАТЕЛЬНО отслеживать СИНХРОННЫЕ фазы запуска и останова. Очень актуально при времени жизни программы больше чем поделка "хэйллохты мир". Проявляется как правило при ударных нагрузках на данную систему и комп в частности.

5) при передачи данных между потоками - использовать синхронизирующие, атомарные обьекты ядра (см. Рихтера).

с уважением
(круглый)
...
Рейтинг: 0 / 0
30.03.2006, 16:45
    #33635743
MaximZaikin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы организации многпоточного кода
2 Agent007 Нет я используй UpdateWindow();
2 a shar А как же. В функции где стартует поток вот таким вот макаром DataParams* params;
Что значит AfxBeginThread я такую неиспользую )
...
Рейтинг: 0 / 0
30.03.2006, 16:51
    #33635765
MaximZaikin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы организации многпоточного кода
Товарищ круглый, спасибо за рекомендацию, пойду гляну что там про многопоточность. Но все же вопрос актуален, если есть советы делитесь, тему надо добить сам если узнаю в чем проблемма опишу все нюансы.
...
Рейтинг: 0 / 0
30.03.2006, 16:58
    #33635789
Сергей Ильич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы организации многпоточного кода
MaximZaikin2 Agent007 Нет я используй UpdateWindow();
2 a shar А как же. В функции где стартует поток вот таким вот макаром DataParams* params;
Что значит AfxBeginThread я такую неиспользую )
Не смейся над агентом - он из болгарии, а там язык хоть и славянский, но спряжений и падежей нет. По поводу топика - не тащи в GUI многопоточность из-за одного метода. Используй асинхронный IO, или еще чего. Win32 имеет средства для совершения длительных операций в рамках однопоточного GUI.
...
Рейтинг: 0 / 0
30.03.2006, 17:06
    #33635819
MaximZaikin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы организации многпоточного кода
Да это просто опечатка )
Да в том то и дело что рано или поздно а программу это придется переводить в многопоточность. Кстати никто незнает где Рихтера кучнуть можно ?
...
Рейтинг: 0 / 0
30.03.2006, 17:11
    #33635831
a_shar
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы организации многпоточного кода
Могу рихтера на мыло скинуть.
...
Рейтинг: 0 / 0
30.03.2006, 17:13
    #33635841
Cerebrum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы организации многпоточного кода
a_sharМогу рихтера на мыло скинуть.
и мне, если не сложно, спасибо
...
Рейтинг: 0 / 0
30.03.2006, 17:15
    #33635845
Сергей Ильич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы организации многпоточного кода
MaximZaikinДа в том то и дело что рано или поздно а программу это придется переводить в многопоточность. Кстати никто незнает где Рихтера кучнуть можно ?
Сначала доделай первую версию программы, тебе остается только пофиксить медленную перерисовку во время тяжелого цикла. Переделывай потом.
...
Рейтинг: 0 / 0
30.03.2006, 17:17
    #33635857
gentleman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы организации многпоточного кода
Сергей ИльичПо поводу топика - не тащи в GUI многопоточность из-за одного метода. Используй асинхронный IO, или еще чего. Win32 имеет средства для совершения длительных операций в рамках однопоточного GUI.
Присоединяюсь.
Несколько потоков лучше использовать для ускорения некоторых фоновых процессов обработки.(Вот, например, твой цикл разбить на два отдельных подцикла, каждый из которых обрабатывает свою порцию данных в отдельном потоке , если, конечно это нужно).
...
Рейтинг: 0 / 0
30.03.2006, 17:17
    #33635858
MaximZaikin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы организации многпоточного кода
Товарищ Круглый киньте пожалуйста буду признателен.
Да готова первая версия сообщения выводятся одно за одним в ту же секунду как оно готово, а вот полоса прокрутки виснет, то есть я не могу глянуть что там ниже за сообщения выходят )
...
Рейтинг: 0 / 0
30.03.2006, 17:19
    #33635862
MaximZaikin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы организации многпоточного кода
Нет цикл бить на потоки это будет лишним, а вот закинуть его в отдельный поток самое то )
...
Рейтинг: 0 / 0
30.03.2006, 17:20
    #33635864
Cerebrum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы организации многпоточного кода
MaximZaikinТоварищ Круглый киньте пожалуйста буду признателен.
Да готова первая версия сообщения выводятся одно за одним в ту же секунду как оно готово, а вот полоса прокрутки виснет, то есть я не могу глянуть что там ниже за сообщения выходят )
почему бы не использовать, выделение вновь добавленного айтема, по моему это автоматически передвинет полосу прокрутки?
...
Рейтинг: 0 / 0
30.03.2006, 17:23
    #33635875
MaximZaikin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы организации многпоточного кода
Хорошо как вариант принимается. Но так же замирают все кнопки на форме ни одна не работает пока цикл не отработает )
...
Рейтинг: 0 / 0
30.03.2006, 17:36
    #33635919
Сергей Ильич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы организации многпоточного кода
Вынеси такие длительные операции в отдельную DLL. Там их делай в контексте отдельного треда. Оттуда сообщай основному приложению о ходе процесса с помощью посылки сообщений в окно (PostMessage). Соответственно, методы экспортируемые из DLL должны принимать HWND окна и идентификатор сообщения, который они туда будет посылать по ходу процесса.
...
Рейтинг: 0 / 0
30.03.2006, 17:46
    #33635949
MaximZaikin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы организации многпоточного кода
Хороший совет. Я даже им попытаюсь восползоваться если смогу их вынести в dll, а посему прошу дайте кто нибудь хорошую доку по этому вопросу. Я так понимаю в книге Рихтера все это имеется, прошу выслать на wasihw@mail.ru буду очень признателен.
...
Рейтинг: 0 / 0
30.03.2006, 17:50
    #33635966
MaximZaikin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы организации многпоточного кода
Все получил спасибо большое
...
Рейтинг: 0 / 0
30.03.2006, 18:53
    #33636106
Tracer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы организации многпоточного кода
hThread = CreateThread( NULL,0,ClientThread,(LPVOID)(¶ms),0,&dwThreadId);

используй _begintrhreadex, тогда crt для конкретного потока будет правильно инициироваться
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Проблемы организации многпоточного кода / 22 сообщений из 22, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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