Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.017 c
1-2203
AllDer
2004-01-20 17:08
2004.02.02
Программно нажать TabSheet


11-2049
microlab
2003-05-18 20:53
2004.02.02
Как отобразить HTML


3-2046
dalamar
2004-01-04 00:29
2004.02.02
Как получить количество таблиц в БД Access через ADO подключение?


14-2357
klyonov
2004-01-13 10:41
2004.02.02
winamp


4-2424
chi
2003-11-20 19:56
2004.02.02
HDC





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский