Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.07.01;
Скачать: [xml.tar.bz2];

Вниз

потоки   Найти похожие ветки 

 
авыф   (2007-06-05 12:06) [0]

здраствуйте! возник вопрос по потокам. а точнее по их приостановке и возобновление, просто тестировал как это работает, так вот когда создаешь 2 потока то все нормально, но когда в моем случае 4, то не работает все встает... объясните пожалуйста что я не так делаю? так как код на 5 юнитов, то залил архив исходников сюда http://slil.ru/24467941 весит 17,315 байт... почему все встает не помойму. объясните пожалуйста как работать с большим количеством потоков...


 
tesseract ©   (2007-06-05 12:18) [1]


>  объясните пожалуйста как работать с большим количеством
> потоков...


deadlock это называеться, смотри синхронизацию данных между потоками.


 
Kolan ©   (2007-06-05 12:21) [2]

> как код на 5 юнитов

Выбири проблемные части и запость.


 
авыф   (2007-06-05 12:28) [3]

создаю поток так:
unit Unit2;

interface

uses
 Classes, windows, SysUtils;

type

 TThread1 = class(TThread)
 private
   j,k: integer;
 protected
   procedure Execute; override;
   procedure UpdateLog;              //Добавление записи в Memo
   procedure ThreadStart;            //Старт потока
   procedure ThreadStop;             //Завершение потока
 public
   constructor Create(i: integer);
 end;

implementation

uses unit1;

constructor TThread1.Create(i: integer);
begin
 inherited Create(True);     //Созданный поток создается в приостановленном состоянии
 FreeOnTerminate := True;    //Поток освободит ресурсы при окончании работы
 j:=i;
 k:=0;
 Self.Priority := tpHighest; //Очень высокий приоритет
end;

procedure TThread1.ThreadStart;
begin
 unit1.Form1.StatusBar1.Panels[1].Text := "поток запущен";
end;

procedure TThread1.ThreadStop;
begin
 unit1.Form1.StatusBar1.Panels[1].Text := "";
end;

procedure TThread1.UpdateLog;
begin
 unit1.Form1.Memo1.Lines.Add(IntToStr(k));
end;

procedure TThread1.Execute;
begin
 Synchronize(ThreadStart);               //Сообщение о старте потока

 try
//-- Цикл, пока для потока не будет выдана команда Terminate
   while not Terminated do begin
     Synchronize(UpdateLog); //Сообщаем об изменении
     Inc(k);
     sleep(j);
   end;
 finally
 end;
 Synchronize(ThreadStop);                     //Сообщаем о завершении потока
end;

end.

и так 4 юнита, различаются только названиями юнитов...
потом в главном окне объявляю так:
var
 Th1,Th2,Th3,Th4: TThread;

создаю потоки так:
Th1:=TThread1.Create(StrToInt(Edit1.Text));
 Th2:=TThread2.Create(StrToInt(Edit1.Text));
 Th3:=TThread3.Create(StrToInt(Edit1.Text));
 Th4:=TThread4.Create(StrToInt(Edit1.Text));

переключаюсь между потоками так:
case Form1.RadioGroup1.ItemIndex of
   0: begin
     Th2.Suspend;
     Th3.Suspend;
     Th4.Suspend;
     Th1.Resume;
   end;
   1: begin
     Th1.Suspend;
     Th3.Suspend;
     Th4.Suspend;
     Th2.Resume;
   end;
   2: begin
     Th1.Suspend;
     Th2.Suspend;
     Th4.Suspend;
     Th3.Resume;
   end;
   3: begin
     Th1.Suspend;
     Th2.Suspend;
     Th3.Suspend;
     Th4.Resume;
   end;
 end;

вот если переключаться между двумя потоками то все работает как часы, но если переключиться на третий, то сразу все отрубается и ничего не работает, что я делаю не так?


 
Сергей М. ©   (2007-06-05 12:37) [4]

Для начала убери повышение приоритета до высочайшего.
Не трогай приоритет вообще - пусть он будет по-умолчанию, т.е. tpNormal


 
авыф   (2007-06-05 14:45) [5]


> deadlock

не нашел как ее использовать, не могли бы вы поподробнее про нее рассказать?

> Сергей М.

сделал, но ситуация не изменилась...


 
DVM ©   (2007-06-05 15:04) [6]


> авыф   (05.06.07 14:45) [5]
>
> > deadlock
>
> не нашел как ее использовать, не могли бы вы поподробнее
> про нее рассказать?

deadlock как раз использовать не надо :)))

Это ситуация взаимоблокировки потоков, когда они ждут друг друга и оба висят.


 
Сергей М. ©   (2007-06-05 15:18) [7]


> авыф   (05.06.07 14:45) [5]


Воспользуйся встроенным отладчиком.


 
авыф   (2007-06-05 15:28) [8]

пользовался отладчиком, причем если пошагово нажать чтобы использовать третий поток, то запускаются сразу сразу 2 первых потока, третий вс еравно не запускается, вообщем я в шоке, не мог бы кто-нибудь скинуть пример как работать одновременно с 3 и более потоками, созданными тобой, ну т.е. чтоб можно их было останавливать и запускать?


 
Сергей М. ©   (2007-06-05 16:29) [9]


> третий вс еравно не запускается


Как ты это определил средствами отладчика ?


 
авыф   (2007-06-05 16:29) [10]

возник вопрос а возможно ли узнать что сейчас какой-то поток приостановлен функцией Suspend?


 
Сергей М. ©   (2007-06-05 16:31) [11]

У твоих потоков есть св-во Suspended


 
tesseract ©   (2007-06-05 16:32) [12]


> возник вопрос а возможно ли узнать что сейчас какой-то поток
> приостановлен функцией Suspend?


Лог записывай, лог - при многопоточном приложении он сильно полезен.


 
авыф   (2007-06-05 16:42) [13]

всё, разобрался, я просто некоторые потоки 2 раза подряд приостанавливал, и поэтому они не запускались, надо было так их менять:
case Form1.RadioGroup1.ItemIndex of
   0: begin
     if Th2.Suspended=false then Th2.Suspend;
     if Th3.Suspended=false then Th3.Suspend;
     if Th4.Suspended=false then Th4.Suspend;
     Th1.Resume;
   end;
   1: begin
     if Th1.Suspended=false then Th1.Suspend;
     if Th3.Suspended=false then Th3.Suspend;
     if Th4.Suspended=false then Th4.Suspend;
     Th2.Resume;
   end;
   2: begin
     if Th1.Suspended=false then Th1.Suspend;
     if Th2.Suspended=false then Th2.Suspend;
     if Th4.Suspended=false then Th4.Suspend;
     Th3.Resume;
   end;
   3: begin
     if Th1.Suspended=false then Th1.Suspend;
     if Th2.Suspended=false then Th2.Suspend;
     if Th3.Suspended=false then Th3.Suspend;
     Th4.Resume;
   end;
 end;


 
авыф   (2007-06-05 16:43) [14]


> Сергей М.

спасибо!



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2007.07.01;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.005 c
2-1181089248
delphino
2007-06-06 04:20
2007.07.01
почему в файле справочной системы не отображаются русские буквы


1-1178106337
DelphiLexx
2007-05-02 15:45
2007.07.01
Передать процедуру класса в Обычную функцию


1-1178180255
kyn66
2007-05-03 12:17
2007.07.01
DBGridEh - отсутствует свойство DisableScroll


2-1181452437
Karl
2007-06-10 09:13
2007.07.01
сравнение TStringList и первого столбца ListView


11-1164286342
Stan
2006-11-23 15:52
2007.07.01
Undeclared identifier Hint при добавлении компоненты





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский