Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.11.28;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.043 c
6-1095602469
shuraspb
2004-09-19 18:01
2004.11.28
PortMapping с логом обращений


4-1097839922
Leaner
2004-10-15 15:32
2004.11.28
Местонахождение WINDOWS SYSTEM32 DRIVERS


9-1091044622
XDev
2004-07-28 23:57
2004.11.28
Ускорение отрисовки полигона


1-1100359523
Rusty
2004-11-13 18:25
2004.11.28
Поиск индекса массива по его значению...


14-1100355676
Qwest
2004-11-13 17:21
2004.11.28
Проблема со звуком...