Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с потоками 
:(
    Опции темы
krik
Дата 17.11.2008, 00:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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
PM MAIL   Вверх
ReInit
Дата 17.11.2008, 06:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 14.11.2008

Репутация: 1
Всего: 1



Код

procedure TMyThread.Execute;
begin
  inherited;
  time:=now;
  While (Suspended = false) and (MilliSecondsBetween(Time,Now)<1000) do
    begin
      AddNumber;
      Synchronize(self.PrintResult);
    end;
  Synchronize(self.Proc);
end;

что-то мне подсказывает, что по прошествии 1000 мсек поток успешно завершится и делать
Код

Thread[ActiveThread].Resume;

уже бесполезно...
PM MAIL   Вверх
krik
Дата 17.11.2008, 09:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 28.7.2008

Репутация: нет
Всего: 1



Что же тогда посоветуете для реализации поставленой задачи? Тут принципе задача то остаётся нерешёной. Нада сделать чтобы поток работал определённое время, после чего приостанваливался и когда очередь доходила до него опять запускался, но как это реализовать, так и не нашёл

Это сообщение отредактировал(а) krik - 17.11.2008, 09:28
PM MAIL   Вверх
REZiaMIX
Дата 17.11.2008, 09:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 346
Регистрация: 3.11.2007

Репутация: нет
Всего: 4



Цитата(krik @ 17.11.2008,  09:22)
Что же тогда посоветуете для реализации поставленой задачи? Тут принципе задача то остаётся нерешёной. Нада сделать чтобы поток работал определённое время, после чего приостанваливался и когда очередь доходила до него опять запускался, но как это реализовать, так и не нашёл

Могу предложить алгоритм:
В цикле:
1)Создаем поток
2)WaitForSingleObject для потока
3)goto 1

а сколько раз выполнять цикл - решение Ваше)

Для паузы можно использовать Sleep в процедуре потока.

Это сообщение отредактировал(а) REZiaMIX - 17.11.2008, 09:41


--------------------
user posted image
PM MAIL   Вверх
ReInit
Дата 17.11.2008, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 14.11.2008

Репутация: 1
Всего: 1



Они вручную должны переключатся кнопкой или офтомотически друг за другом?
Если превое, то что-то типа этого
Код

procedure TMyThread.Execute;    
begin    
inherited;
while true do 
  begin
  Inc(self.FNumber);
  Synchronize(self.PrintResult);    
  end;
Synchronize(self.Proc);
end;


И почему у тебя time - глобальная?


Это сообщение отредактировал(а) ReInit - 17.11.2008, 16:59
PM MAIL   Вверх
krik
Дата 17.11.2008, 19:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 28.7.2008

Репутация: нет
Всего: 1



Вообщем проблему решил, были проблемы в логике программы, да и таймер это точно был гон. А задача была и чтобы само приостанваливалось через какой-то промежуток времени и если нажата кнопка то независимо от того прошёл ли период времени.
PM MAIL   Вверх
krik
Дата 13.2.2009, 17:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 28.7.2008

Репутация: нет
Всего: 1



Ну вот и снова я, думаю не стоит создавать новую тему. При решении диспетчеризации потоков произошла проблема. У меня есть программка реализующая метод FIFO, но дело в том, что если я запускаю её на слабых компах, получается так, что поток не успевает остановиться (скорей всего) и выдаётся ошибка. 

Код

procedure TForm1.Button2Click(Sender: TObject); 
begin
  Thread[ActiveThread].Suspend;//>>>>>>>>>>>>>>>>>тут приостановка 
  Inc(ActiveThread);
  if (ActiveThread = 5) then ActiveThread := 0;
  Thread[ActiveThread].Resume;//
end;


Пример программки в архиве.

Кто что посоветовать может по этому поводу? Думаю если не тут, то уверен что больше не кто не поможет. 

Присоединённый файл ( Кол-во скачиваний: 6 )
Присоединённый файл  FIFO2.zip 33,33 Kb
PM MAIL   Вверх
krik
Дата 14.2.2009, 11:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 28.7.2008

Репутация: нет
Всего: 1



Разве ни кто не сталкивался с этим? Да, забыл сказать что появляется ошибка "Thread Error: Отказано в доступе (5)"

Это сообщение отредактировал(а) krik - 14.2.2009, 18:29
PM MAIL   Вверх
krik
Дата 15.2.2009, 12:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 28.7.2008

Репутация: нет
Всего: 1



Люди! Ну очень прошу помочь, перепробовал много, но не могу найти решение ((((((
PM MAIL   Вверх
MetalFan
Дата 15.2.2009, 12:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 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...
PM MAIL   Вверх
krik
Дата 15.2.2009, 15:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 28.7.2008

Репутация: нет
Всего: 1



2MetalFan чтобы ты посоветовал на счёт 2 пункта?
PM MAIL   Вверх
MetalFan
Дата 15.2.2009, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 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...
PM MAIL   Вверх
krik
Дата 16.2.2009, 18:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 28.7.2008

Репутация: нет
Всего: 1



Т.е. к примеру получается если Signaled,  то разрушаем поток и запускаем следующий, при этом вся проверка должна проходить в Ехеcute? Спрашиваю это потому, что FreeOnTerminate в этом случае не поможет. Вот для примера, если я понял так должно быть?
Код

procedure TSimpleThread.Execute;
begin
  ev := TEvent.Create(nil,true,false,'test');
    repeat
      ev.ReSetEvent;
      res := ev.WaitFor(10);
      Synchronize(ShowInfo);
      if integer(res)=0 then
          Terminate;
    until Terminated;
  ev.Free;
end;

PM MAIL   Вверх
MetalFan
Дата 16.2.2009, 20:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 16
Всего: 128



а зачем пересоздавать потоки???


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
krik
Дата 17.2.2009, 19:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 28.7.2008

Репутация: нет
Всего: 1



>>>и вообще Suspend/Resume не самый лучший вариант для реализации задачи приостановки выполнения кода потока...

Ты же сам написал
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0518 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.