![]() |
|
Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply |
![]()
|
|
| krik |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 24 Регистрация: 28.7.2008 Репутация: нет Всего: 1 |
Всем привет! Столкнулся с проблемой в потоках. Вообщем есть программа. В ней создаются 5 экземпляров класса потока. Сначало запускается первый экземпляр, который выполняет (как и все остальные) простую операцию инкрементирования переменной и выводит её в стринг гирд. После того как нажата кнопка, либо пройдёт время (например 2 секнунды) запускается следующий (2) экземпляр, а первый ставиться на паузу так сказать. Так продолжается пока не достигает до 5 последнего потока, после него должн быть запущен снова 1 по списку экземпляр. Проблема заключается в том, что пройдя первый круг, не запускается снова первый экзепляр. Незнаю испробовал много, но чёт не получается. Кстати вообще это реализация карусельной многозадачности (round robin) по теме диспечеризация потоков. Кто сможет помочь - проект приложен! Заранее благодарю!
Это сообщение отредактировал(а) krik - 17.11.2008, 00:06 Присоединённый файл ( Кол-во скачиваний: 11 )
Round_Robin.rar 219,23 Kb |
|||
|
||||
| ReInit |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 14.11.2008 Репутация: 1 Всего: 1 |
что-то мне подсказывает, что по прошествии 1000 мсек поток успешно завершится и делать
уже бесполезно... |
||||
|
|||||
| krik |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 24 Регистрация: 28.7.2008 Репутация: нет Всего: 1 |
Что же тогда посоветуете для реализации поставленой задачи? Тут принципе задача то остаётся нерешёной. Нада сделать чтобы поток работал определённое время, после чего приостанваливался и когда очередь доходила до него опять запускался, но как это реализовать, так и не нашёл
Это сообщение отредактировал(а) krik - 17.11.2008, 09:28 |
|||
|
||||
| REZiaMIX |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 346 Регистрация: 3.11.2007 Репутация: нет Всего: 4 |
Могу предложить алгоритм: В цикле: 1)Создаем поток 2)WaitForSingleObject для потока 3)goto 1 а сколько раз выполнять цикл - решение Ваше) Для паузы можно использовать Sleep в процедуре потока. Это сообщение отредактировал(а) REZiaMIX - 17.11.2008, 09:41 -------------------- ![]() |
|||
|
||||
| ReInit |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 14.11.2008 Репутация: 1 Всего: 1 |
Они вручную должны переключатся кнопкой или офтомотически друг за другом?
Если превое, то что-то типа этого
И почему у тебя time - глобальная? Это сообщение отредактировал(а) ReInit - 17.11.2008, 16:59 |
|||
|
||||
| krik |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 24 Регистрация: 28.7.2008 Репутация: нет Всего: 1 |
Вообщем проблему решил, были проблемы в логике программы, да и таймер это точно был гон. А задача была и чтобы само приостанваливалось через какой-то промежуток времени и если нажата кнопка то независимо от того прошёл ли период времени.
|
|||
|
||||
| krik |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 24 Регистрация: 28.7.2008 Репутация: нет Всего: 1 |
Ну вот и снова я, думаю не стоит создавать новую тему. При решении диспетчеризации потоков произошла проблема. У меня есть программка реализующая метод FIFO, но дело в том, что если я запускаю её на слабых компах, получается так, что поток не успевает остановиться (скорей всего) и выдаётся ошибка.
Пример программки в архиве. Кто что посоветовать может по этому поводу? Думаю если не тут, то уверен что больше не кто не поможет. Присоединённый файл ( Кол-во скачиваний: 6 )
FIFO2.zip 33,33 Kb |
|||
|
||||
| krik |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 24 Регистрация: 28.7.2008 Репутация: нет Всего: 1 |
Разве ни кто не сталкивался с этим? Да, забыл сказать что появляется ошибка "Thread Error: Отказано в доступе (5)"
Это сообщение отредактировал(а) krik - 14.2.2009, 18:29 |
|||
|
||||
| krik |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 24 Регистрация: 28.7.2008 Репутация: нет Всего: 1 |
Люди! Ну очень прошу помочь, перепробовал много, но не могу найти решение ((((((
|
|||
|
||||
| MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 16 Всего: 128 |
дааа... статейку про потоки неплохо былоб прочитать.
1. Нет смысла в TMyThread.Execute вызывать inherited. 2. Не корректно из кода самого потока проверять флаг Suspended... и вообще Suspend/Resume не самый лучший вариант для реализации задачи приостановки выполнения кода потока... 3. Да и вообще код потока-бредовый... Это сообщение отредактировал(а) MetalFan - 15.2.2009, 12:39 -------------------- There are always someone smarter than you... |
|||
|
||||
| krik |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 24 Регистрация: 28.7.2008 Репутация: нет Всего: 1 |
2MetalFan чтобы ты посоветовал на счёт 2 пункта?
|
|||
|
||||
| MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 16 Всего: 128 |
могу посоветовать поковырять юнит SyncObjs. например обертку над Event'ами TEvent.
создаешь в конструкторе потока TEvent с InitialState = false. в execute в цикле проверяешь состояние евента (WaitFor с небольшим временем ожидания), если Signaled - то выполняешь нудное действие. соотв когда снаружи надо "активировать" трэд, вызываешь TMyThread.FEvent.SetEvent. только цикл в execute тоже надо правильно написать с учетом проверки флага Terminated... а то получишь "неубиваемый" поток. -------------------- There are always someone smarter than you... |
|||
|
||||
| krik |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 24 Регистрация: 28.7.2008 Репутация: нет Всего: 1 |
Т.е. к примеру получается если Signaled, то разрушаем поток и запускаем следующий, при этом вся проверка должна проходить в Ехеcute? Спрашиваю это потому, что FreeOnTerminate в этом случае не поможет. Вот для примера, если я понял так должно быть?
|
|||
|
||||
| MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 16 Всего: 128 |
а зачем пересоздавать потоки???
-------------------- There are always someone smarter than you... |
|||
|
||||
| krik |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 24 Регистрация: 28.7.2008 Репутация: нет Всего: 1 |
>>>и вообще Suspend/Resume не самый лучший вариант для реализации задачи приостановки выполнения кода потока...
Ты же сам написал |
|||
|
||||
![]()
|
| Правила форума "Delphi: WinAPI и системное программирование" | |
|
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |