|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
26.04.2016, 07:30 | #1 |
Регистрация: 26.04.2016
Сообщений: 5
|
IdTCPServer повисание приложения
Все привет!
Имеется сервер IdTCPServer. При подключении к серверу клиента, клиент добавляется в список Clients: TThreadList; Код:
Код:
Последний раз редактировалось sosyamba; 26.04.2016 в 07:40. |
26.04.2016, 11:45 | #2 |
Участник клуба
Регистрация: 23.04.2009
Сообщений: 1,058
|
IdTCPServer1Execute на каждое подключение САМ создаёт отдельный поток, таймер такого не умеет
Если вам человек помог, не стесняйтесь говорить спасибо (весы под аватаром)
|
26.04.2016, 14:23 | #3 |
Регистрация: 26.04.2016
Сообщений: 5
|
|
26.04.2016, 15:43 | #4 |
Участник клуба
Регистрация: 23.04.2009
Сообщений: 1,058
|
может юзать System.Classes.TThread.Synchronize
или critical section delphi
Если вам человек помог, не стесняйтесь говорить спасибо (весы под аватаром)
|
26.04.2016, 16:10 | #5 | |
Регистрация: 26.04.2016
Сообщений: 5
|
Цитата:
Код:
почему то происходит конфликт между потоками и основным потоком программы. между потоками в IdTCPServer конфликта нет, стабильно работают. как только включаю таймер программа зависает через пару минут. |
|
26.04.2016, 17:08 | #6 |
Старожил
Регистрация: 26.04.2008
Сообщений: 2,645
|
Не нужно ещё одну КС. В приведённом отрывке кода нет ответа.
Вероятно, LockList из другого потока блокирует главный поток (пусть даже на доли секунды) во время очередного тика таймера, но сразу после этого идёт обращение к форме или её полям (переменным класса и т.п.). Таким образом поток заблокировал форму (т.к. таймер скорее всего на форме), но ждёт доступа к ней чтобы что-то прочитать/записать с неё. Это и приводит к блокировке блокировщика. Писано наугад, т.к. подробных кодов нет. Но если полный код был, то всё равно написал то же самое, т.к. было бы лень )) |
27.04.2016, 14:15 | #7 |
Регистрация: 26.04.2016
Сообщений: 5
|
Разрешено ли так делать в обработчике IdTCPServer1.OnExecute вызвать IdTCPServer1.Contexts.LockList; ?
может из за этого что глючит? |
27.04.2016, 15:51 | #8 |
Старожил
Регистрация: 26.04.2008
Сообщений: 2,645
|
Делать можно. Может ли глючить? - Глючить может даже от мёда, если его холодной водой запивать. По отдельности можно многое, а вот в тандеме нет.
На лицо двойная блокировка. Между любыми LockList/UnLockList нельзя ничего синхронизировать (или лезть в другие потоки без синхронизации). P.S. Можно безопасно синхронизировать только то, что не имеет общих ресурсов из области КС |
30.04.2016, 13:40 | #9 |
Регистрация: 26.04.2016
Сообщений: 5
|
OnExecute - выполняется НЕ в основном потоке приложения
а OnDisconnect ? в основном или нет? |
Опции темы | Поиск в этой теме |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
IdTCPServer и IdTCPClient | -=<_Makap_>=- | C++ Builder | 0 | 08.12.2012 18:41 |
idTCPServer | Anatoliy24 | Работа с сетью в Delphi | 7 | 12.02.2011 11:40 |
idTCPserver и кирилица | BARNEY | Работа с сетью в Delphi | 7 | 21.10.2010 14:47 |
IdTCPServer | Pankhammer | Работа с сетью в Delphi | 0 | 30.04.2010 00:14 |
IdTCPServer Exception | Comer_Jus | Работа с сетью в Delphi | 2 | 25.06.2008 22:23 |