Другие языки программирования и технологии

Потоки в Делфи 2010

Пишу код: ....procedure TForm1.Button1Click(Sender: TObject); var I, i1, x: Integer; s : string; btsl, btsl1, data : tstringlist; thr : tmythread; begin customcheck := true; loadcheck := false; thr := tmythread.create(true); thr.FreeOnTerminate := true; thr.Priority := tpHighest; thr.Start; while loadcheck = false do begin sleep(10); end; ....end; procedure tmythread.Execute; var i, i1, z :integer; table, table1 : TRVtableItemInfo; gr : timage; k, n : string; sl : tstringlist; c, s : real; begin sl := tstringlist.Create; z := 0; sl.Add('<<Услуга>>' + '=0'); if customcheck = true then begin sl.Clear; z := numz; k := form1.combobox2.Items.Strings[form1.combobox2.ItemIndex]; for i := 0 to form1.listbox1.Count - 1 do begin sl.Add(form1.listbox1.Items.Strings + '=' + form1.valuelisteditor1.Values[form1.listbox1.Items.Strings]); end; n := form1.Edit1.Text; c := cost; s := form1.summsk; end; loadcheck := true; .... Прога виснит, переменная loadcheck не записывается. Подскажите почему, и как сделать чебы заработало.
Нельзя из потока без синхронизации обращаться к vcl-объектам, и вообще ни к чему, чем не владеет данный поток. А ты трогаешь form1 с ее контролами, и глобальную cost
И к loadcheck кстати тоже это относится

И да, это:
while loadcheck = false do begin
sleep(10);
end;
просто кошмарно. Лучше не использовать потоки вообще, чем ждать их таким образом
Игорь Ананьев
Игорь Ананьев
8 882
Лучший ответ
Евгений Федоров Ммм, хорошо, задача какая, нужно загрузить в локальные переменные необходимые данные(т.к данные обнуляются в процедуре Button1Click), соответственно, нужно подождать. Дожидаться завершения потока не вариант, и пихать весь код потока в Button1Click тоже, т.к зависание будет длиться несколько секунд.

Твой вариант, как сделать?
В целом согласен с Ириной, но особого трагизма в обращении к чужим объектам не вижу, ведь в данном конкретном случае конкуренции между потоками нет и даже системные события не обрабатываются - все эти методы можно рассматривать как глобальные переменные. И "принадлежность" потоку в этом контексте - понятие весьма относительное.
Что касается конкретно данного задания.. . Делай так:

1. Внутри потока опиши все необходимые разделы памяти (параметры) , создавай их вместе сосвоим потоком (и с ним же освобождай) , передавай в них все что надо, запускай поток. Так и Ирина будет довольна, и на будущее будет полезно.
2. Показывай на экране окошко с прогрессбаром и кнопкой отмены - сие есть красиво.
3. Пусть основная программа занимается анимацией прогрессбара и опросом кнопки, пока работает поток.
4. Поток не должен выходить сам, только установить (свой! ) флаг окончания.
5. После окончания спряч окошко, считай из потока результат, освободи поток, возвращайся в главный цикл или куда тебе надо.
6. В самом потоке, ясен пень, надо предусмотреть переменную прогресса (фактически, это твоя переменная i) и условие досрочного окончания (if terminated).

А вообще-то процессы, которые идут всего несколько секунд, не вызывают у пользователя заметного отторжения, так что в даном случае можно и не заморачиваться с потоками.
Евгений Федоров Да, пожалуй, так лучше, тока прогрессбар не уместен в данном проекте. Спасибо.
Lupus Lupus >>особого трагизма в обращении к чужим объектам не вижу, ведь в данном конкретном случае конкуренции между потоками нет и даже системные события не обрабатываются

Ну да, и смысла использовать потоки тоже нет :)
А если представить что автор хочет оставить интерфейс отзывчивым на время работы потока, и добавит хотябы Application.ProcessMessages как проблема сразу появится.
То есть или проблемы нет ,но нет и преимужеств потока, или проблема есть.