Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
14-53744
DimaK
2004-01-27 23:36
2004.02.17
Ошибка при установки


7-53800
maxXP
2003-12-02 19:23
2004.02.17
Как определить нажата, отпущена кокретная клавиша клавиатуры a-z


14-53731
хз
2004-01-23 13:30
2004.02.17
Продолжение истории противостояния...


7-53784
Dark Elf
2003-10-30 12:22
2004.02.17
Программирование кассовых аппаратов


14-53723
iNew
2004-01-29 17:19
2004.02.17
Ну и как вам ГОЛОД на ТНТ





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский