![]() |
|
|
#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 в потоке хороший тон?
|