Консультация № 81859
10.04.2007, 08:46
0.00 руб.
0 2 2
Здравствуйте, уважаемые эксперты!
Проблема такая:
В программе есть код:
Query1.active:=false;
Query1.SQL.add(‘SELECT * FROM [TableName];‘);
Query1.active:=true;
Запрос из большой таблицы, все выводится в DBGrid.
Так вот, когда начинает выполняться запрос, форма уже не реагирует ни на какие действия пользователя. Можно ли это как-то обойти, т.к. мне необходимо сделать отмену запроса? Пробовал несколько потоков, но опять же второй поток включается по нажатию клавиши на форме, а это невозможно во время запроса...

Обсуждение

Неизвестный
10.04.2007, 08:53
общий
это ответ
Здравствуйте, Бочаров Кирилл Юрьевич!
Что-то я не совсем понял.
У Вас при запуске запроса "подвисает" приложение??
И поэтому Вы не можете нажать другую кнопку??
Если да то попробуйте так: См.Приложение

Приложение:
Query1.active:=false;Application.ProcessMessages;Query1.SQL.add(\‘SELECT * FROM [TableName];\‘);Query1.active:=true;
Неизвестный
10.04.2007, 09:59
общий
это ответ
Здравствуйте, Бочаров Кирилл Юрьевич!

Почему с потоками не получилось? Код в студию!
В потоке должен выполняться сам запрос, вся работа с пользовательским интерфейсом - только в основном...
Метод TThread.Terminated лишь устанавливает флаг TThread.Terminated при этом не завершая сам процесс.

Приложение:
TMyThread = class(TThread)privateprotected procedure Execute; override;end;var MyThread: TMyThread;...procedure TMyThread.Execute();begin //тут открываем TDataSetend;procedure TForm1.OnOpenDataSetMenuItemClick(Sender: TObject);begin MyThread := TMyThread.Create(False); ShowPosueForm; //тут показываем на экране форму с паузой/отменойend;procedure TPouseForm.Button1Click(Sender: TObject);begin //обрати внимания как завершаем процесс TerminateThread(MyThread.Handle, 1{код возвращения}); //MyThread.Terminate тут не прокатит, т.к. она всего лишь //вывешивает флаг MyThread.Terminated и при этом процесс не завершаетend;
Форма ответа