Страница 1 из 1

TThread.Suspend

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

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

Добавлено: 15 июн 2007, 10:33
kdv
что вы все....
в отдельном треде можно работать с коннектом, до тех пор пока только этот тред с коннектом и работает. Т.е. параллельное обращение из разных тредов к одному коннекту недопустимо. Собственно, все.

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

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

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

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

Добавлено: 15 июн 2007, 14:05
kdv
Поясните, что вы имеете ввиду под "помогут разработчики"?
имеется в виду "разработчики сервера Firebird помогут". Они тут бывают.

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

Добавлено: 15 июн 2007, 15:56
Merlin
Этта.. он же не fbclient тормозит, а прогу свою...

Добавлено: 15 июн 2007, 16:36
Dimitry Sibiryakov
А энтот fbclient, типа, в каком-то другом контексте работает?

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

Re: TThread.Suspend

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

Re: TThread.Suspend

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

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

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