Форум: "Базы";
Текущий архив: 2004.11.28;
Скачать: [xml.tar.bz2];
Внизgпопытка подключения к неработаюшему серверу Найти похожие ветки
← →
sten (2004-10-28 16:02) [0]Здравствуйте !
есть такая проблема : во время попытки подключиться к серверу MSSQL, если сервер недоступен, нужно через интервал
в 1 секунду вывести форму, на которой будет написано "подождите".
Так как при попытке подключиться к неработающему серверу метод ADOQuery.Open полностью подвешивает программу,
просто выполнить form2.Show в таймере невозможно. Поэтому я попытался запихать это в отдельный поток.
(пока без всякого таймера, т.к. не работает даже без него)
Теперь я пытаюсь вызвать поток до попытки соединения, однако form2 появляется только через 8 сек., вместе с
сообщением об ошибке.
procedure TForm1.Button1Click(Sender: TObject);
var t:tmythread;
begin
t:=tmythread.Create(true);
t.Resume;
form1.ADOQuery1.SQL.Text:="select * from table1";
form1.ADOQuery1.Open;
end;
procedure tmythread.Execute;
begin
synchronize(form2.Show);
end;
Почему так происходит, ведь второй поток должен нормально выполняться, вне зависимости от того, чем занят основной ?
← →
Johnmen © (2004-10-28 16:05) [1]Зачем же через 1 сек. ? Сразу и без потока.
form2.Show;
Aplication.ProcessMessages;
form1.ADOQuery1.Open;
← →
sten (2004-10-28 16:17) [2]нет, надо именно через секунду, так как в случае наличия сервера, это форма будет мигать. (т.е. если ответ пришел через 0.2 сек, форму показывать ненадо). Мне надо вывести сообщение, только если ответа с сервера нет в течении этого промежетка времени.
← →
Johnmen © (2004-10-28 16:32) [3]:)))
А если соединение произошло через 1.1 сек. ? Мигнуть на 0.1 ?form2.Show;
Aplication.ProcessMessages;
Sleep(1000);
form1.ADOQuery1.Open;
← →
sten (2004-10-28 16:46) [4]>Sleep(1000);
очень смешно
если соединение установлено и сервер работает, то ответ будет приходить раньше, чем через секунду (в большинстве случаев). Задержка на секунду и более будет означать проблемы с сервером или со связью. Но я не хочу, чтобы приложение просто висело 8 сек, пусть лучше сообщение показывает.
Так как там насчет потоков, почему они себя так ведут ?
← →
Johnmen © (2004-10-28 16:57) [5]Потому, что чинить наручные часы кувалдой не стОит.
А что там с таймером ? Его обработчик, надеюсь, вызывается ? :)
← →
sten (2004-10-28 17:15) [6]если имеешь в виду что-то типа
procedure tmythread.Execute;
var t:ttimer;
begin
t:=ttimer.Create(application);
t.Interval:=1000;
t.Enabled:=true;
t.OnTimer:=do_smth;
end;
то тоже неработает. Что-же не так ?
← →
Johnmen © (2004-10-28 17:24) [7]Имею в виду просто таймер. Без своих потоков.
← →
Johnmen © (2004-10-28 17:32) [8]Увы... Таймер тоже "умирает"...
← →
sten (2004-10-28 17:36) [9]я не понимаю, почему так происходит, ведь это другой поток, неужели query умудряется подвешивать все потоки ?
← →
sniknik © (2004-10-28 20:44) [10]synchronize(form2.Show);
запускается в основном. у тебя нет 2х потоков. не, код ты написал, но по факту нет.
← →
sten (2004-10-29 14:39) [11]что-же делать ?
← →
sten (2004-10-31 10:47) [12]ну что, неужели никто с потоками не работал ?
← →
sniknik © (2004-10-31 14:13) [13]работал. всех перечислять? ;о)
логику надо менять, но что делать нужно неизвестно, у тебя же в вопросе проблема по твоей логиге без описания задачи, а она тупиковая.
возможно явные потоки вообще не нужны, можно обойтись асинхронным коннектом/запросами (это поток в самом ADO).
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2004.11.28;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.038 c