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

Вниз

Эта проблемная многопоточность   Найти похожие ветки 

 
Vilux ©   (2004-11-22 09:59) [0]

Создаю много потоков и в каждом потоке подключаю dll функцией
 hinstDLL := LoadLibrary(pchar(dllname));
И пишу логи. В логах видно, что в каждом потоке hinstDLL имеет одно и то же значение... так и должно быть? Дело в том, что моя программа вылетает, когда одновременно в потоках пытается подключиться dll-ка и вызваться процедура из нее... но если в каждом потоке подключать dll-ку через Synchronize, то прога не вылетает. Но зато очень медленно. Такое впечатление, что использование SYnchronize отменяет весь эффект многопоточности. Как быть? Как мне в потоках отркывать одновременно одну dll-ку и чтобы без вылетов?


 
Reindeer Moss Eater ©   (2004-11-22 10:05) [1]

У тебя ошибка в программе


 
Vilux ©   (2004-11-22 10:17) [2]

Reindeer Moss Eater, а конкретнее? Почему ты так решил?


 
Reindeer Moss Eater ©   (2004-11-22 10:21) [3]

Мне интуиция и здравый смысл это подсказывают.
А так же личный опыт.


 
Digitman ©   (2004-11-22 10:32) [4]


> в каждом потоке hinstDLL имеет одно и то же значение...
> так и должно быть?


да


> использование SYnchronize отменяет весь эффект многопоточности


на то Synchronize и нужен


 
ggs   (2004-11-22 10:32) [5]


> hinstDLL имеет одно и то же значение... так и должно быть?

Да, DLL проецируется на адресное пространство твоего процесса,
а hinstDLL и есть это адрес.


> Дело в том, что моя программа вылетает, когда одновременно
> в потоках пытается подключиться dll-ка и вызваться процедура
> из нее...

ХЗ... возможно один поток вызывает FreeLibrary а потом вытается
использовать функцию из DLL, в общем "ошибка в программе" ;)


> Такое впечатление, что использование SYnchronize отменяет
> весь эффект многопоточности.

Не совсем так... посмотри реализацию Synchronize в VCL.


> Как быть?

Загружай/выгружай DLL в основном потоке, а в рабочих используй
GetModuleHandle(Ex)...


 
Vilux ©   (2004-11-22 10:33) [6]

ПРовел еще один тест... если dll-ка пустая, то все работает*(т.е. из кучи потоков запускается без проблем). А если я там какие-нибудь переменные ввожу и все, больше ничего, никаких процедур не вызываю, ничего... то тогда прога вылетает...просто исчезает.


 
Reindeer Moss Eater ©   (2004-11-22 10:36) [7]

Тебе ж говорят, что у тебя ошибка в программе.


 
TUser ©   (2004-11-22 10:37) [8]


> если в каждом потоке подключать dll-ку через Synchronize,
> то прога не вылетает. Но зато очень медленно. Такое впечатление,
> что использование SYnchronize отменяет весь эффект многопоточности

S выполняет код от имени главного потока приложения. Так что все выполняется в одном потоке, а подгрузка dll - дело действительно довольно медленное. С другой стороны, оно хоть и медленное, но обычно однократное - подгрузили и работаем, так что заметных тормозов быть не должно. А вот если ты ее подгружаешь много раз (ты ведь создаешь много потоков) - то действительно может тормозить.
Судя по тому, что хендл везде получется один и тот же, ты грузишь одну и ту же библиотеку - а она грузится в адресное пространство процесса, причем один раз. Но попыток загрузить ее получется много, причем все в контексте главного потока. А это плохо.
Непонятно - почему бы не загрузить dll один раз в главном потоке и передать всем остальным потокам ее хендл.

PS. На этом форуме переодиечски появляются вопросы про много потоков - часто оказывается, что их так много и не надо. Опиши свою задачу, много потоков реально необходимо для очень небольшого количества задач, таких как обслуживание многих пользователей на крутых серверах и т.д.


 
Vilux ©   (2004-11-23 14:13) [9]

Описываю задачу...
есть сервер, который получает данные на вход и запускает поток. В этом потоке в зависимости от полученных данных пускается определенная dll-ка, которая работает с БД(Access) через ADO-компоненты. Нужно, чтобы все это работало быстро. Как я выяснил, прога виснет, когда создается много потоков и каждый поток через функцию dll пытается работать с БД. Т.е. мне надо, чтобы в каждом потоке подргужалась dll-ка в новую область памяти. А то получается, что я в потоках подгружаю dll и думаю, что и функции из нее в каждом потоке расположены по разным адресам, а оказывается, что все потоки одновременно обращаются к функции по одному и тому же адресу(судя по тому, что hinstdll везде одинаков), отсюда походу и идут все косяки


 
Alexander Panov ©   (2004-11-23 14:16) [10]

Vilux ©   (23.11.04 14:13) [9]

DLL загружается в твой процесс, а не в поток, и в любом потоке адрес будет одинаков.


 
Vilux ©   (2004-11-23 14:25) [11]

я уже понял, так как мне тогда решить мою проблему? чтобы не было конфликтов между потоками...


 
Alexander Panov ©   (2004-11-23 14:28) [12]

Vilux ©   (23.11.04 14:25) [11]
я уже понял, так как мне тогда решить мою проблему? чтобы не было конфликтов между потоками...


Так это не проблема.
Вот только неизвестно, в чем она у тебя - кода-то никто до сих пор не увидел.


 
sniknik ©   (2004-11-23 14:30) [13]

может убрать их? и сделать на ассинхронных запросах (выполнение в потоках внутри ADO).
и dll возможено не нужна вовсе...


 
Vilux ©   (2004-11-23 14:30) [14]

ну... я думал проблема в том, что потоки пытаются одновременно вызвать функцию, которая расположена по одному и тому же адресу. Или не так?


 
Vilux ©   (2004-11-23 14:32) [15]

dll нужна по-любому, это позволяет наращивать модульность программы. Т.е. написал новую dll и просто указал программе в каком случае ее запускать. При этом не придется трогать исходники самой программы


 
Alexander Panov ©   (2004-11-23 14:54) [16]

Vilux ©   (23.11.04 14:32) [15]
По поводу одинх и тех же адресов:
http://delphimaster.net/view/1-1101141727/


 
Alexander Panov ©   (2004-11-23 14:56) [17]

Vilux ©   (23.11.04 14:32) [15]
Вот это что -http://delphimaster.net/view/1-1101141727/ ?

Нехорошо спамом заниматься.


 
TUser ©   (2004-11-23 15:02) [18]


> Vilux ©   (23.11.04 14:13) [9]

Ты точно уверен, что тормоза возникают на подгрузке dll, а не от того, что сервер базы данных не может обрабатывать много запросов?

В любом случае, я бы сделал загрузку dll только один раз. И флаг какой-нибудь, типа "dll загружена". Тогда потоки ничего грузить пытаться не будут, а будут просто получать готовый хендл.


 
Digitman ©   (2004-11-23 15:03) [19]


> Vilux ©   (23.11.04 14:32) [15]
> dll нужна по-любому, это позволяет наращивать модульность
> программы


гадиматья.
механизм динамически линкуемых библиотек был придуман и реализован отнюдь не для этого



Страницы: 1 вся ветка

Текущий архив: 2004.12.05;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.07 c
1-1101300025
Pretender
2004-11-24 15:40
2004.12.05
Подсчет символов


1-1100612069
ninja
2004-11-16 16:34
2004.12.05
nil


14-1100557778
Piter
2004-11-16 01:29
2004.12.05
Можно откатить Internet Explorer?


4-1098081869
Slonco
2004-10-18 10:44
2004.12.05
Как оборвать проигрывание звука при помощи кнопки?


9-1090692921
Zak3D[@Tm]
2004-07-24 22:15
2004.12.05
Правильное востановление окна