Форум: "Основная";
Текущий архив: 2004.02.02;
Скачать: [xml.tar.bz2];
ВнизПотоки. Почему не работает код? Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.074 c