2013-11-27 5 views
1

Я попытался создать поток выполнения, но поток ведет себя странно, код не имеет ссылки на холст.Тема написана на рабочем столе

procedure TBruteThread.Execute; 
var 
    j: Integer; 
begin 
    inherited; 
    FreeOnTerminate:=True; 
    for j:=1 to StrToInt(Form1.Edit1.Text) do begin 
    if Terminated then break; 
    Form1.Label2.Caption:=IntToStr(j); 
    end; 
    Form1.Label2.Caption:='Thread is destroyed'; 
    Self.Terminate; 
end; 

enter image description here

Кто есть какие-либо идеи, чтобы решить эту странную проблему?

+1

Кто-то, возможно, захочет сделать это специально. –

+3

Для получения дополнительной информации о VCL и потоках см. ['Thread-safe in delphi'] (http://stackoverflow.com/q/17705197/576719). –

ответ

5

Проблема с вашим кодом в том, что он нарушает правила потоковой передачи VCL. Доступ к компонентам VCL должен быть сделан из основного потока. Используйте Synchronize или Queue (методы TThread) для выполнения обновлений GUI в основном потоке.

Другие комментарии:

  • Set FreeOnTerminate вне метода резьбы.
  • Вызов Завершение как заключительный акт метода потока бессмысленно. Поток вот-вот закончится.
+0

Действительно, проблема заключалась в несинхронизированном методе. Спасибо. – Rafael

+2

Установка 'FreeOnTerminate' внутри' Execute() 'отлично и безопасно. Он не оценивается до тех пор, пока не выйдет 'Execute()'. Что касается вызова 'Terminate()' в конце 'Execute()', это может быть полезно время от времени, если свойство 'Terminated' проверяется после выхода' Execute() ', чтобы узнать, выходит ли' Execute() ' изящно или нет, особенно в более старых версиях, у которых не было свойства FatalException. –

+0

@Remy Поскольку код на внешней стороне должен знать о FreeOnTerminate, в основном имеет смысл установить его снаружи, на мой взгляд. –

Смежные вопросы