Форум: "Основная";
Текущий архив: 2004.02.17;
Скачать: [xml.tar.bz2];
ВнизКак запустить Thread параллельно основному потоку? Найти похожие ветки
← →
h0use (2004-02-05 16:37) [0]Есть проблема, из TThread общаюсь с серваком. Когда сервак ничего не посылает, то Thread висит, но он висит вметсе с основным кодовым потоком, т.е. висит вся прога, а как сделать, так, чтоб прога работала вне зависимости от созданного TThread?
← →
MBo (2004-02-05 16:41) [1]> он висит вметсе с основным кодовым потоком, т.е. висит вся прога
Значит, неправильно организована синхронизация
← →
Verg (2004-02-05 16:42) [2]
> h0use © (05.02.04 16:37)
> Есть проблема, из TThread общаюсь с серваком. Когда сервак
> ничего не посылает, то Thread висит, но он висит вметсе
> с основным кодовым потоком,
Очевидно ты для общения с серваком вызываешь какую-нибудь ф-цию, которая собственно и ждет данных от сервера посредством Synchronize, а так как в данном случае эта ф-ция будет выполняться гл. код. потоком, то гланый и будет "висеть", а доп-ный будет тоже висеть и ждать, пока гл. отработает код этой ф-ции.
← →
h0use (2004-02-05 16:45) [3]Нет...совсем не так. Вот Execute:
procedure TConn.Execute;
var
AMsg:TCommBlock;
begin
while (not Terminated) and (DM.TCPClient.Connected) do
try
DM.TCPClient.ReadBuffer(AMsg,SizeOf(AMsg));
FMain.UpdateLed(2,True);
AMsg.Msg:=UnCryptStr(AMsg.Msg);
case AMsg.Command of //
cmdLogin : ClientConnect(AMsg);
cmdLogout : ClientDisconnect(AMsg);
cmdCommand : ClientCommand(AMsg);
cmdSQL : ClientSQL(AMsg);
cmdMessage : ClientChat(AMsg);
cmdSystem : ClientSystem(AMsg);
end;
FMain.UpdateLed(2,False);
except
on e: Exception do
ClientDisconnect(AMsg);
end;
end;
end;
← →
Verg (2004-02-05 16:52) [4]Ты бы еще такой код привел:
procedure TMyThread.Execute;
begin
while not terminated do
Dm.CtrlHandle.TCPIPConnect.ReadData()
end;
- тромозит потоки: как быть?
← →
h0use (2004-02-05 16:56) [5]И все же как мне сделать многопоточность?
TCPClient - это Инди компонента. В Сервак они сделаи многопоточным и все там рабоате, а как мне сделать Client таким же?
← →
Digitman (2004-02-05 16:57) [6]далеко ходить не будем
начнем с вероятного ляпа :
FMain.UpdateLed(2,True);
здесь, очевидно, идет обращение к методу формы, в котором осуществляется попытка манипуляций с каким-то виз.контролом а-ля "индикатор"
уж сколько раз твердили миру - недопустимо это делать в доп.код.потоке !
← →
Verg (2004-02-05 16:58) [7]Я к тому, что ты бы хоть пояснил кто такой DM, TCPClient, какие компоненты в каких режимах, а то на тебе: "у меня телевизор не показывает, как сделать чтоб показывал?".
← →
h0use (2004-02-05 17:08) [8]
> Digitman © (05.02.04 16:57) [6]
Да у меня он всего один создается и поэтому я без стразха пишу именно так, и это как раз работает. Виснет после того как сервак перестает слать сообщения и соотв. на строчке DM.TCPClient.ReadBuffer(AMsg,SizeOf(AMsg));, а антифриз я юзать не хочу, хочу без него обойтись.
> Verg © (05.02.04 16:58) [7]
DM:TDataModule;
TCPClient:TidTCPClient;
FMain:TForm;
← →
Verg (2004-02-05 17:16) [9]Не, с "индями" - я пас: мути наверчено-о-о....
← →
Digitman (2004-02-05 17:19) [10]
> Да у меня он всего один создается и поэтому я без стразха
> пишу именно так, и это как раз работает
да хоть косой десяток ! недопустимо это делать в осн.код.потоке, еще раз говорю !
← →
Digitman (2004-02-05 17:23) [11]
> антифриз я юзать не хочу, хочу без него обойтись
а антифриз здесь как мертвому припарка
антифриз нужен для "размораживания" осн.код.потока, в котором, соотв-но. и предполагается вызывать ReadBuffer() ..
ты же вызываешь ReadBuffer() в доп.код.потоке, который, соотв-но. и блокируется ожиданием возврата из этого метода ... а на осн.код.поток это влиять, насколько мне известно, не должно никак - он (осн.поток) продолжает жить своей параллельной независимой жизнью
← →
h0use (2004-02-05 17:24) [12]Хорошо, согласен с тобой что нельзя, но как тогда мне поступать?
← →
Digitman (2004-02-05 17:44) [13]сначала убедись еще раз, что виз.интерфейс "мерзнет" ИМЕННО на блок.вызове ReadBuffer() ... лично я в это не верю
← →
Digitman (2004-02-05 18:00) [14]не хочу лезть в исходники TCPClient (да и нет у меня их - Д5 пользую), но склонен предположить, что в нек. случаях некорректно создавать/разрушать объект TCPClient в основном потоке, а управлять им в дополнительном
наиболее безопасным (и логически правильным) будет вынос свей работы с компонентами транспорта (от их создания вплоть до их разрушения) в доп.код.поток, коль скоро он призван реализовывать как минимум транспортную логику
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.02.17;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.317 c