|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
30.09.2013, 07:52 | #1 |
БохЪ
Форумчанин
Регистрация: 30.09.2009
Сообщений: 724
|
Синхронизация одного потока
Что за бред я написал в названии темы? Вот и я думаю...
Но, для начала, вопрос к модератору: ничего страшного, что я пишу эту тему в разделе свободного общения? Ведь я не делаю привязку к языку. Или стояло выбрать другой раздел? А теперь суть вопроса: Имеется функция, внутри которой создается поток который что-то там делает, не суть что. Сама функция ждет, пока поток закончит свои дела. Ждет она при помощи WaitForSingleObject: делается вызов WaitForSingleObject с лимитом ожидания 50 мс, потом идет проворот оконной петли с помощью PeekMessage и PM_REMOVE, что бы окошки могли себя отрисовать, потом опять вызов WaitForSingleObject и тд. До тех пор, пока WaitForSingleObject возвращает WAIT_TIMEOUT. В ходе работы этой функции, используется некий внешний объект, данные в котором инициализируются при вызове функции, а очищаются внутри создаваемого функцией потока. Для синхронизации работы с этим объектом при вызове функции из нескольких потоков приложения я использую критическую секцию: Код:
Для меня это какая-то магия. Как может один и тот же поток работать асинхронно относительно самого себя Подозреваю что это связано с проворотом оконной петли... Но, что характерно, если использовать вот такую "синхронизацию" при помощи флага: Код:
Кто нибудь может объяснить, что вообще происходит
В планах порабощение вселенной...
|
30.09.2013, 09:43 | #2 |
Участник клуба
Регистрация: 04.04.2010
Сообщений: 1,554
|
а ты уверен что обработчики кнопок в одном потоке работают?
|
30.09.2013, 09:43 | #3 | |||
Старожил
Регистрация: 20.04.2008
Сообщений: 5,526
|
Цитата:
Default значение =false. Вот и висим ждем пока этот никто поменяет нам флаг для выхода. Цитата:
и все потоки будут пользоваться ПОСЛЕДНЕЙ копией исходных данных. (заданных по нажатию ВТОРОЙ кнопки !) Цитата:
инициализация первым инициализация вторым очистка первым Второму достались ОЧИЩЕННЫЕ!! потоки не должны заниматься ВНЕШНИМИ данными. Задача очистки должна выполняться ВНЕ потока, после того как мы дождались его выполнения.
программа — запись алгоритма на языке понятном транслятору
Последний раз редактировалось evg_m; 30.09.2013 в 09:53. |
|||
30.09.2013, 10:00 | #4 | ||
БохЪ
Форумчанин
Регистрация: 30.09.2009
Сообщений: 724
|
the_deer_one, конечно. Да и если бы они работали в разных потоках то все было бы гладко.
evg_m, Цитата:
Цитата:
Проблема появляется если я запускаю функцию дважды в ОДНОМ потоке. Как такое реально, я не понимаю.
В планах порабощение вселенной...
Последний раз редактировалось zumm; 30.09.2013 в 10:08. |
||
30.09.2013, 10:24 | #5 |
Участник клуба
Регистрация: 04.04.2010
Сообщений: 1,554
|
Может у тебя критическая секция отрабатывает, а поток продолжает работать?
|
30.09.2013, 10:32 | #6 | ||||
Старожил
Регистрация: 20.04.2008
Сообщений: 5,526
|
после того как вошли в цикл проверки флага НИКТО извне не может поменять, а мы сами не может выйти!
итак это ПЕРВЫЙ вызов (и flag=false ) Код:
Может вы не заметили, я использую критическую секцию для синхронизации Цитата:
Цитата:
Цитата:
Цитата:
КАК на это влияет ВАША критическая секция? НЕ знаю, т.к. ее место при работе (не создании!) потока неизвестно. P.S. чтобы не писать "проворот оконной петли" логичнее использовать (передавать потоку!) CallBack функцию для получения извещения от том что все готово.
программа — запись алгоритма на языке понятном транслятору
Последний раз редактировалось evg_m; 30.09.2013 в 11:03. |
||||
30.09.2013, 10:50 | #7 | ||
БохЪ
Форумчанин
Регистрация: 30.09.2009
Сообщений: 724
|
Цитата:
Код:
Цитата:
Код:
В планах порабощение вселенной...
|
||
30.09.2013, 11:31 | #8 | |
Старожил
Регистрация: 20.04.2008
Сообщений: 5,526
|
Цитата:
программа — запись алгоритма на языке понятном транслятору
|
|
30.09.2013, 11:37 | #9 |
БохЪ
Форумчанин
Регистрация: 30.09.2009
Сообщений: 724
|
Ох. Я думал, проблемой станет не это.
Код:
В планах порабощение вселенной...
|
30.09.2013, 11:51 | #10 | |
Участник клуба
Регистрация: 04.04.2010
Сообщений: 1,554
|
zumm
Цитата:
|
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Синхронизация | kuba1981 | PHP | 9 | 06.05.2013 11:39 |
Как получить доступ к методу потока(TThread) из основного потока? | Pcrepair | Общие вопросы Delphi | 3 | 30.03.2013 14:52 |
проблема при копировании одного столбца из одного файла в другой файл | tanunya | Помощь студентам | 0 | 24.02.2012 21:30 |
Должно быть 3 потока. А диспетчер задач показывает, что потока создано 2 | BEL9ILLI | Общие вопросы Delphi | 3 | 06.12.2011 20:26 |
Как узнать номер потока из самого потока? | GaMeSTeR | Помощь студентам | 0 | 03.12.2010 09:50 |