|
#16
|
||||
|
||||
Цитата:
Цитата:
И ещё немного смущают манипуляции с StringList. Создавать его лучше по-нужде, перед использованием проверять на наличие и разрушать в завершении приложения. Либо же создавать однажды при запуске приложения и разрушать при завершении приложения. |
#17
|
|||
|
|||
Цитата:
Сделать еще один флаг, и вместо фора поставить вайл с проверкой флага? Просто одно действие в форе может выполняться достаточно долго и будет впечатление что или прога зависла или вообще никак не реагирует на кнопку. Цитата:
Цитата:
Последний раз редактировалось novashdima, 12.03.2014 в 17:56. |
#18
|
|||
|
|||
Код:
if Assigned(StringList) then FreeAndNil(StringList); Код:
FreeAndNil(StringList); Далее Я уже спрашивал - что с чем синхронизируется спомощью CriticalSection ? Если она используется только в одном потоке, то она не нужна. |
#19
|
|||||
|
|||||
Цитата:
Например здесь: Код:
procedure MyThread.Execute; begin // inherited; Это здесь не нужно while not Terminated do begin // Безопасная точка - проверяем не нужно ли приостановиться (Suspend) Analys; end; end; Цитата:
Цитата:
Цитата:
Цитата:
|
#20
|
||||
|
||||
Цитата:
Цитата:
Цитата:
Цитата:
|
#21
|
||||
|
||||
Цитата:
Цитата:
Код:
type MyThread = class(TThread) private FSuspendNeeded: LongBool; procedure SetSuspendNeeded(const Value: LongBool); public property SuspendNeeded: LongBool read FSuspendNeeded write SetSuspendNeeded; protected procedure Execute; override; end; { MyThread } procedure MyThread.Execute; begin while not Terminated do begin Analys; if SuspendNeeded then Suspend; end; end; procedure MyThread.SetSuspendNeeded(const Value: LongBool); begin if FSuspendNeeded <> Value then Windows.InterlockedExchange(LongInt(FSuspendNeeded), LongInt(Value)); end; Код:
AnalysThread.SuspendNeeded := True; Цитата:
|
#22
|
|||
|
|||
Цитата:
Насчет остального спасибо, завтра буду пробовать, а то надо на работу бежать уже. |
#23
|
||||
|
||||
Цитата:
|
#24
|
|||
|
|||
Цитата:
ап. поставил в цикле обработки в процедуре Анализ проверку на AnalysThread.Suspended, он всегда равен false, запустил программу, запустил обработку данных, приостановил выполнение и оказывается SuspendNeeded меняется на true, но поток не приостанавливается. Мне еще и в сам цикл во время обработки данных впихнуть проверку значения SuspendNeeded? Да, еще всегда интересовали, можно настроить отладчик так, чтобы при отладке я трассировал только код своей программы, не заходя в System.SysUtils и тому подобные? |
#25
|
||||
|
||||
Цитата:
Цитата:
Цитата:
После чего сохрани и перестрой проект: Меню -> "Project" -> "Build All Projects" |
#26
|
|||
|
|||
Цитата:
Каким образом в коде обработки указать, что поток может быть приостановлен? Цитата:
|
#27
|
||||
|
||||
Цитата:
Цитата:
Цитата:
|
#28
|
|||
|
|||
Цитата:
Код:
procedure TForm1.StartProcessClick(Sender: TObject); begin if AnalysThread.Suspended then begin AnalysThread.SuspendNeeded := False; AnalysThread.Resume; end else begin AnalysThread.SuspendNeeded := True; end; end; procedure TForm1.StopProcessClick(Sender: TObject); begin AnalysThread.Terminate; ClearForm; end; procedure MyThread.Analys; begin try if AnalysThread.Terminated then Exit; if AnalysThread.SuspendNeeded then AnalysThread.Suspend; CriticalSection.Enter; for i := 0 to Form1.ListBox.Count - 1 do begin if SuspendNeeded then AnalysThread.Suspend; ..... finally Synchronize(Form1.ClearForm); end; end; procedure MyThread.Execute; begin while not Terminated do begin if SuspendNeeded then Suspend; Analys; end; end; procedure MyThread.SetSuspendNeeded(const Value: LongBool); begin if FSuspendNeeded <> Value then InterlockedExchange(LongInt(FSuspendNeeded), LongInt(Value)); end; procedure MyThread.UpdateGauge; begin if not AnalysThread.Suspended then Form1.Gauge.Progress := Position; end; procedure MyThread.UpdateMemo; begin if not AnalysThread.Suspended then begin Form1.Memo.Text := StringList.Text; Form1.Memo.Refresh; end; end; |
#29
|
|||
|
|||
Просто правила хорошего тона
Код:
procedure MyThread.UpdateGauge; begin if not AnalysThread.Suspended then Form1.Gauge.Progress := Position; end; Код:
procedure MyThread.UpdateGauge; begin if not Self.Suspended then Form1.Gauge.Progress := Position; end; Код:
procedure MyThread.UpdateGauge; begin if not Suspended then Form1.Gauge.Progress := Position; end; |
#30
|
||||
|
||||
а разве использование глобальной Form1 в потоке хороший тон?
Пишу программы за еду. __________________ |