Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.02.02;
Скачать: CL | DM;

Вниз

Потоки. Почему не работает код?   Найти похожие ветки 

 
LordBTR   (2004-01-20 12:11) [0]

Ув. мастера. Помогите, пожалуйста. Не отрабатывает процедура в доп. потоке.
Смысл того, чего пытаюсь добится следующий:
На форме имеем две кнопки, запрос к БД Oracle, label.
В основном потоке по нажатию на кнопку1 формируется запрос к БД (1-1,5 мин), а пока он отрабатывает - в доп. потоке меняем label.Caption на текущее время. По нажатию кнопки2 закрываем запрос, тормозим доп. поток.
Но в итоге label.Caption меняется только после отработки запроса.
Вот текст модуля:

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, DB, DBAccess, Ora, MemDS, ExtCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
lbl: TLabel;
OraSession1: TOraSession;
OraDataSource1: TOraDataSource;
q1: TOraQuery;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
TMyThread = class(TThread)
private
{ Private declarations }
procedure UpdateCaption;
protected
procedure Execute; override;
end;

var
Form1: TForm1;
MyThread: TMyThread;

implementation

{$R *.dfm}

procedure TMyThread.Execute;
begin
while not(terminated) do
begin
Synchronize(UpdateCaption);
Sleep(1000);
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
MyThread:=TMyThread.Create(True);
MyThread.Priority := tpLower;
MyThread.FreeOnTerminate:=True;
MyThread.Resume;
q1.Open;
end;

procedure TMyThread.UpdateCaption;
begin
Form1.lbl.Caption:=TimeToStr(Time);
Form1.lbl.Refresh;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
q1.Close;
MyThread.Terminate;
end;

end.


 
Андрей Сенченко ©   (2004-01-20 12:14) [1]

Application.ProcessMessages ?


 
Семен Сорокин ©   (2004-01-20 12:14) [2]

тебе наоборот запрос в потоке надо открывать.


 
LordBTR   (2004-01-20 12:22) [3]

>Андрей Сенченко © (20.01.04 12:14) [1]
>Application.ProcessMessages ?
Где? Когда? Как? Зачем?

>Семен Сорокин © (20.01.04 12:14) [2]
>тебе наоборот запрос в потоке надо открывать.
Пробовал, результат тотже. Пока запрос не отработает - никаких изменений капшена.


 
Семен Сорокин ©   (2004-01-20 12:24) [4]

LordBTR (20.01.04 12:22) [3]
Пробовал, результат тотже. Пока запрос не отработает - никаких изменений капшена.

и не будет, капшен меняй в основном потоке :)


 
LordBTR   (2004-01-20 12:27) [5]


> Семен Сорокин © (20.01.04 12:24) [4]
> и не будет, капшен меняй в основном потоке :)

В том же потоке, в котором открываю запрос? Ага, может еще и дискетку параллельно форматировать? :)


 
Семен Сорокин ©   (2004-01-20 12:31) [6]

LordBTR (20.01.04 12:27) [5]
В том же потоке, в котором открываю запрос? Ага, может еще и дискетку параллельно форматировать? :)

ты явно не понял:
1. создаешь доп. поток - в нем открываешь свой запрос;
2. и параллельно на форме запускаешь таймер для обновления твоего caption"а, когда поток завершиться (откроется запрос) - останавливай таймер.
что неясно?


 
Digitman ©   (2004-01-20 12:32) [7]


> LordBTR (20.01.04 12:27) [5]


тебе же говорят - делай Query.Open в теле метода Execute !! Это и будет "открытие запроса в доп.потоке"


 
Юрий Зотов ©   (2004-01-20 12:37) [8]

> LordBTR (20.01.04 12:27) [5]

Насчет дискетки - это, конечно, смешно. Но лучше все же еще раз прочитать [2] и [4] ВНИМАТЕЛЬНО.

Если не поможет, то жмем F1 и читаем про Synhronize. Не для того, чтобы его использовать, а для того, чтобы уяснить, что визуальные обновления должны производиться в основном потоке.

Соответственно, параллельная работа (запрос) должна исполняться в дополнительном потоке.


 
LordBTR   (2004-01-20 12:37) [9]

Ok. Ok. Сейчас попробую.


 
LordBTR   (2004-01-20 13:12) [10]

Ну вот, вроде теперь все работает и картина проясняется.
Получается, что все действия с визуальными компонентами должны производиться в основном потоке.
Всем, кто помогал, большое спасибо.


 
Юрий Зотов ©   (2004-01-20 13:26) [11]

> LordBTR (20.01.04 13:12) [10]

Не только визуальные обновления, а вообще все, что должно проходить через цикл выборки сообщений основного потока.


 
YuRock ©   (2004-01-20 14:09) [12]

> LordBTR (20.01.04 13:12) [10]
> Юрий Зотов © (20.01.04 13:26) [11]

Ну, это не совсем обязательно - можно (и лучше) и из другого потока обращаться к окнам главного и без Synchronize, но с умом, чтоб коллизий не было - используя CriticalSection"ы.



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

Текущий архив: 2004.02.02;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.024 c
14-2275
Petr V. Abramov
2004-01-09 16:46
2004.02.02
Фоторепортаж с MMP


14-2349
Talla2k
2004-01-10 17:07
2004.02.02
pdf надо разблокировать


1-2226
лошок
2004-01-20 15:21
2004.02.02
Как ограничить размер текстового файла


14-2303
ИдиотЪ
2004-01-12 13:25
2004.02.02
Спящий режим


1-2147
tria
2004-01-21 14:29
2004.02.02
Создать переменную текущего класса.