Страница 1 из 3
TAdoQuery
Добавлено: 07 июн 2005, 08:22
ChPuK
передо мной была поставлена задача, написать программу, для перегона информации из MS SQL в MySQL
все хорошо получаеться, НО, на серваке MS SQL я забираю информацию с таблицы, которую рисует процедура.
Проблема в том что время выполнения данной процедуры иногда достигает минуты и более
Как сделать кнопку которая будет выполнять отмену выполнения запроса SQL
Добавлено: 07 июн 2005, 08:41
ChPuK
или хотя бы как сделать, чтобы во время выполнения данного запроса программа не подвисала
пробовал ProcessMessages, не помогает совсем...
Добавлено: 07 июн 2005, 09:20
YurikGL
Делай ProcessMessages в теле процедуры или пускай ее в потоке TThread
Добавлено: 07 июн 2005, 09:27
ChPuK
в теле какой процедуры?
процедура о которой я написал, что формирует таблицу, она написана на MS SQL
т.е. находиться на стороне сервера, а на MS SQL процедур типо ProcessMessages нету!
Добавлено: 07 июн 2005, 09:33
YurikGL
>Делай ProcessMessages в теле процедуры
>в теле какой процедуры?
я попутал... думал, что процедура в делфе
Работай через потоки
Добавлено: 07 июн 2005, 09:33
ChPuK
поточнее опиши плиз
просто давно уже за дельфей не сидел
все забыл....
Добавлено: 07 июн 2005, 09:35
ChPuK
по поводу работы с TThread
наскоко я знаю это многопоточный класс
но как им пользоваться я понятия не имею
Добавлено: 07 июн 2005, 10:18
ChPuK
блин
прочел информацию по поводу TThread но не понял точно что и как
посмотрел пример от дельфи
тоже не до конца понял
если можете дайте пример по задаче:
есть процедура, при выполнении которой программа зависает на минуту другую, но никакие ProcessMessages не помогут, т.к. там нету циклов
нужно сделать так, чтобы при выполнении данной процедуры программа не висела
это нужно сделать посредством TThread
только прошу не нужно давать ссылки на источники, я их прочел, везде одно и тоже и не нужно говорить посмотреть пример, тоже прочел
Добавлено: 07 июн 2005, 11:01
LAngel
маленький классик для запуска любой процедуры в отдельном потоке:
Код: Выделить всё
type
TProcType = procedure;
TMyThread = class(TThread)
ProcToRun: TProcType;
procedure Execute; override;
constructor Create(Proc: TProcType); reintroduce;
destructor Destroy; override;
end;
...
procedure TMyThread.Execute;
begin
ProcToRun;
Destroy;
end;
constructor TMyThread.Create(Proc: TProcType);
begin
ProcToRun := Proc;
inherited Create(True);
end;
destructor TMyThread.Destroy;
begin
if Handle <> 0 then TerminateThread(Handle, 0);
inherited;
end;
Привер вызова... процедура LockIt выводит на форму в label числа от 0 до 20000.
Запускается при нажатии кнопки 1, убивается кнопкой 2 в любой момент. Приложение не подвисает.
Код: Выделить всё
procedure LockIt;
var i: Integer;
begin
i := 0;
While i < 20000 do
begin inc(i); Form1.Label1.Caption := IntToStr(i); end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
MyT := TMyThread.Create(LockIt);
MyT.Resume;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
if MyT <> nil then FreeAndNil(MyT);
end;
Добавлено: 07 июн 2005, 11:06
ChPuK
большое спасиоб
p.s. блин какже трудно из веба в по возвращаться
