Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

gпопытка подключения к неработаюшему серверу [D7, MSSQL]


sten ©   (2004-10-28 16:02:00) 

Здравствуйте !

есть такая проблема : во время попытки подключиться к серверу 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;

Почему так происходит, ведь второй поток должен нормально выполняться, вне зависимости от того, чем занят основной ?


sniknik   (2004-10-31 14:13:00) [1]

работал. всех перечислять? ;о)

логику надо менять, но что делать нужно неизвестно, у тебя же в вопросе проблема по твоей логиге без описания задачи, а она тупиковая.

возможно явные потоки вообще не нужны, можно обойтись асинхронным коннектом/запросами (это поток в самом ADO).


sten   (2004-10-31 10:47:00) [2]

ну что, неужели никто с потоками не работал ?


sten   (2004-10-29 14:39:00) [3]

что-же делать ?


sniknik   (2004-10-28 20:44:00) [4]

synchronize(form2.Show);
запускается в основном. у тебя нет 2х потоков. не, код ты написал, но по факту нет.


sten   (2004-10-28 17:36:00) [5]

я не понимаю, почему так происходит, ведь это другой поток, неужели query умудряется подвешивать все потоки ?


Johnmen   (2004-10-28 17:32:00) [6]

Увы... Таймер тоже "умирает"...


Johnmen   (2004-10-28 17:24:00) [7]

Имею в виду просто таймер. Без своих потоков.


sten   (2004-10-28 17:15:00) [8]

если имеешь в виду что-то типа

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 16:57:00) [9]

Потому, что чинить наручные часы кувалдой не стОит.
А что там с таймером ? Его обработчик, надеюсь, вызывается ? :)


sten   (2004-10-28 16:46:00) [10]

>Sleep(1000);

очень смешно

если соединение установлено и сервер работает, то ответ будет приходить раньше, чем через секунду (в большинстве случаев). Задержка на секунду и более будет означать проблемы с сервером или со связью. Но я не хочу, чтобы приложение просто висело 8 сек, пусть лучше сообщение показывает.
Так как там насчет потоков, почему они себя так ведут ?


Johnmen   (2004-10-28 16:32:00) [11]

:)))
А если соединение произошло через 1.1 сек. ? Мигнуть на 0.1 ?
form2.Show;
Aplication.ProcessMessages;
Sleep(1000);
form1.ADOQuery1.Open;


sten   (2004-10-28 16:17:00) [12]

нет, надо именно через секунду, так как в случае наличия сервера, это форма будет мигать. (т.е. если ответ пришел через 0.2 сек, форму показывать ненадо). Мне надо вывести сообщение, только если ответа с сервера нет в течении этого промежетка времени.


Johnmen   (2004-10-28 16:05:00) [13]

Зачем же через 1 сек. ? Сразу и без потока.
form2.Show;
Aplication.ProcessMessages;
form1.ADOQuery1.Open;


Наверх

Титульная страница Поиск, карта сайта Написать письмо