Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с потоками в DLL, Не работает Synchronize… 
:(
    Опции темы
Gnusss
  Дата 13.6.2007, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 190
Регистрация: 19.1.2005

Репутация: нет
Всего: нет



Привет всем.

Столкнулся  smile  с такой проблемой:

В DLL создаю потоки (TThread),каждый поток создает (TIdHTTP) и закачивает нужные данные.
Но проблема в том, что при вызове Synchronize выполнение потока останавливается, а Synchronize не выполняется. И главное поток не закрывается, а просто зависает и дальше ничего не делает.

Из-за чего может возникать такая проблема, даже не представляю, т.к. раньше не когда не работал с потоками в DLL.

Может, есть, какие особенности при работе с потоками в DLL?

Заранее благодарю за ответ.
PM MAIL   Вверх
Romkin
Дата 13.6.2007, 16:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 189
Регистрация: 14.11.2006
Где: Москва

Репутация: 2
Всего: 5



Есть особенности пользования Synchronize в dll ;)
Может, обойдешься другими средствами? Сообщениями, например?
PM ICQ   Вверх
Dinosauro
Дата 13.6.2007, 16:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 13.6.2007

Репутация: нет
Всего: нет



Когда-то тоже натыкался на данную проблему.
Я считаю это не доработкой VCL.
Одним из вариантов решения данной проблемы время от времени продергивать в основном потоке метод
CheckSynchronize(). ниже приведен код класса, который в таймере это и делает (код на С++, но я думаю там все ясно). Попробуй создать подобный объект в основном потоке.

Код

class TdepArcSynchronize
{
private:
        TTimer* fTimerSync;
public:
        TdepArcSynchronize() :
        fTimerSync(new TTimer(NULL)) {
          fTimerSync->Interval = 10;
          fTimerSync->OnTimer = TimerSync;
        }
        ~TdepArcSynchronize() {
          delete fTimerSync;
        }
        void __fastcall TimerSync(TObject* Sender) {
          CheckSynchronize();
        }
};


PM MAIL   Вверх
Gnusss
  Дата 13.6.2007, 16:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 190
Регистрация: 19.1.2005

Репутация: нет
Всего: нет



Romkin, в принципе сообщениями обойтись, наверное, можно, сейчас попробую.
Цитата(Romkin @  13.6.2007,  16:24 Найти цитируемый пост)
особенности пользования Synchronize в dll ;)

Хотелось бы почитать про эти особенности.
PM MAIL   Вверх
MetalFan
Дата 13.6.2007, 18:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 62
Всего: 128



Цитата(Gnusss @  13.6.2007,  16:43 Найти цитируемый пост)
Хотелось бы почитать про эти особенности. 

открываешь ДНК VCL и "читаешь" про особенности "из первых рук".
...
откуда можно выяснить, что объекты TApplication несколько отличаются в приложении и DLL, что накладывает ограничение на использование TThread.Synchronize в DLL.


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Alexeis
Дата 13.6.2007, 18:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Цитата(MetalFan @  13.6.2007,  18:42 Найти цитируемый пост)
что объекты TApplication несколько отличаются в приложении и DLL, что накладывает ограничение на использование TThread.Synchronize в DLL. 

  Ага TApplication просто не обрабатывает очередь сообщений, а потому не вызвает обработчик onIdle. 

  Вообще принцип таков, поток ставит блокировку (входит в критическую секцию, которая есть и в Application.onIdle), но для того чтобы она сработала основной поток должен войти в обработчик Application.onIdle и там "освободить" второй поток после чего самому заблокироваться на критической секции занятой в Synchronize. 
  Т.е. в Synchronize второй поток ждет пока закончит работу основной поток и залочиться после чего будет работать только он один.
  
  Но обработчик onIdle вызывается в Application.run, которое не вызывается в Dll никогда так как у нее нет своей очереди сообщений. Потому Synchronize безвременно ждет пока основной поток залочиться, но это никогда не произойдет.

Это сообщение отредактировал(а) Alexeis - 13.6.2007, 18:54


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0481 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.