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

Вниз

Как запустить 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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.026 c
1-53619
Ramario
2004-02-07 11:37
2004.02.17
Меню файла


1-53589
mao
2004-02-08 13:32
2004.02.17
RichEdit


14-53739
Abajun
2004-01-28 16:03
2004.02.17
Работа с многопроцессорными машинами


1-53607
Budy
2004-02-07 00:27
2004.02.17
Form2 на Form1


1-53616
Анатолий
2004-02-07 12:30
2004.02.17
Опять по автоматическому обнновлению программы