TThread.Suspend

IBX, FIBPlus, UIB, ADO, .Net и прочее-прочее-прочее, в общем все, что относится к созданию приложений, работающих с InterBase, Firebird и Yaffil - клиент-серверных, трехзвенных, консольных и т.п.

Модератор: kdv

Ответить
Sikambr
Сообщения: 41
Зарегистрирован: 03 ноя 2005, 08:31

TThread.Suspend

Сообщение Sikambr » 15 июн 2007, 08:30

Подлючаюсь к FB2 через FIBPlus в отдельном потоке.
Сделал возможность приостанавливать поток.
Не заметил чтобы что-то, при этом, глючило.

Может ли приостанавка/восстановление потока привести к ошибке в момент выполнения запросов и фетча данных?

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 15 июн 2007, 10:33

что вы все....
в отдельном треде можно работать с коннектом, до тех пор пока только этот тред с коннектом и работает. Т.е. параллельное обращение из разных тредов к одному коннекту недопустимо. Собственно, все.

p.s. можно из разных тредов в одном коннекте, синхронизируя треды. но это будет не параллельное обращение к коннекту.

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 15 июн 2007, 11:22

kdv писал(а):p.s. можно из разных тредов в одном коннекте, синхронизируя треды. но это будет не параллельное обращение к коннекту.
В этом случае треды собственно и не нужны :)

Slavik
Сообщения: 115
Зарегистрирован: 17 янв 2007, 11:52

Сообщение Slavik » 15 июн 2007, 11:24

Вопрос, как я понимаю, был в другом. Если чел стопорнёт поток, то, например, не отвалится ли коннект, не потеряются ли данные (если поток приостановлен во время фетча), или ещё какая-нибудь бяка...
Тут скорее помогут разработчики (и эксперименты!), особенно, если указать время, на которое приостанавливается поток.

Sikambr
Сообщения: 41
Зарегистрирован: 03 ноя 2005, 08:31

Сообщение Sikambr » 15 июн 2007, 12:24

Slavik писал(а):Если чел стопорнёт поток, то, например, не отвалится ли коннект, не потеряются ли данные (если поток приостановлен во время фетча), или ещё какая-нибудь бяка...
Вы все правильно поняли. Мои экмперименты ни к чему не привели, точнее к ошибкам не привели.
1. перед запуском потока коннектился к базе
2. в потоке делал бесконечный цикл, в котором открывал запрос и фетчил данные
3. периодически делал Suspend/Resume
Slavik писал(а):Тут скорее помогут разработчики (и эксперименты!),
Поясните, что вы имеете ввиду под "помогут разработчики"?
Slavik писал(а):особенно, если указать время, на которое приостанавливается поток.
Здесь также не совсем понял.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 15 июн 2007, 14:05

Поясните, что вы имеете ввиду под "помогут разработчики"?
имеется в виду "разработчики сервера Firebird помогут". Они тут бывают.

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Сообщение Dimitry Sibiryakov » 15 июн 2007, 15:50

kdv писал(а):"разработчики сервера Firebird помогут".
Тут еще пригодились бы разработчики Windows. Конечно, не факт, что код Winsocks исполняется в пользовательском режиме, но если suspend застанет поток между посылкой пакета на сервер и уходом в ожидание ответа, лично я не берусь предсказать результаты.

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 15 июн 2007, 15:56

Этта.. он же не fbclient тормозит, а прогу свою...

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Сообщение Dimitry Sibiryakov » 15 июн 2007, 16:36

А энтот fbclient, типа, в каком-то другом контексте работает?

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 15 июн 2007, 17:11

Сдаёццо мне, что он отклик на переданный через него пакет за щекой у себя должен придержать до тех пор, пока не попросят. Или, в зависимости от вызова API, сунуть в память по указанному при вызове адресу, не заботясь о том, встречают его там или нет. Иначе нафиг он вообще сдался.

Slavik
Сообщения: 115
Зарегистрирован: 17 янв 2007, 11:52

Re: TThread.Suspend

Сообщение Slavik » 18 июн 2007, 10:10

Sikambr писал(а):Может ли приостанавка/восстановление потока привести к ошибке в момент выполнения запросов и фетча данных?
Может для личного спокойствия стоит пересмотреть алгоритм? Например, не грубо останавливать поток, а посылать ему сообщение с "просьбой" :) перестать фетчить данные.

Sikambr
Сообщения: 41
Зарегистрирован: 03 ноя 2005, 08:31

Re: TThread.Suspend

Сообщение Sikambr » 18 июн 2007, 10:25

Slavik писал(а):не грубо останавливать поток, а посылать ему сообщение с "просьбой" :) перестать фетчить данные.
или в потоке завести и поднимать флаг Stopped, и вместо прямой проверки флага Terminated проверять его через функцию:

Код: Выделить всё

function TmyThread.IsTermitate: Boolean;
begin
  while not Terminated and Stopped do
    Sleep(1000);
  Result := Terminated;
end;

Ответить