![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вопрос на понимание потоков [D7]
yurikon © (2012-04-13 11:38:00)Добрый день всем!
Прочитал всю справку делфи по потокам. Трабл с одновременной работой с данными мне понятен. Не понятно вот что. Могут ли два потока "одновременно" вызвать процедуру из третьего юнита и исполнится ли эта процедура параллельно в двух потоках или будет некая очередность?
С уважением.
MBo (2012-05-02 13:31:00) [1]>KSergey © (02.05.12 13:26) [28]
Это ты просто реестр давно не перечитывал ;)
KSergey (2012-05-02 13:26:00) [2]> Сергей М. © (28.04.12 09:57) [24]
О! Спасибо
А то я знал (просто как мантру), что для каждого потока - обязательно свой ADOConnection, иначе беда, но у меня не было аргументов для атеистов.
yurikon (2012-04-28 16:11:00) [3]Благодарю! Теперь все корректно завершается.
RWolf (2012-04-28 15:57:00) [4]
> Как понять что метод Execute потока завершил работу
mythread.WaitFor;
yurikon (2012-04-28 15:52:00) [5]Спасибо за обсуждение!
Тут еще вопрос возник. Как понять что метод Execute потока завершил работу, чтобы можно было с чистой совестью выгрузит его из памяти?
При закрытии программы делаю Terminate, затем Free для потока. Иногда вылетает ошибка доступа к данным. Возможно по этой причине...
Сергей М. (2012-04-28 09:57:00) [6]да что там рассуждать "показатель - не показатель" ?
в реестре черным по белому написано
HKEY_CLASSES_ROOT\ADODB.Connection\CLSID = {00000514-0000-0010-8000-00AA006D2EA4}
HKEY_CLASSES_ROOT\CLSID\{00000514-0000-0010-8000-00AA006D2EA4}\InprocServer32
ThreadingModel = Apartment
А раз Apartment, то ССЗБ, пытающийся использовать этот COM-объект одновременно более чем в одном потоке, делает это искл-но на свой страх и риск.
sniknik (2012-04-28 09:29:00) [7]> Это не про то эксперимент
именно про то
при увеличении размера операции стали дольше, и начались проблемы с локированием потоков, пересечения операций в одно и тоже время из разных.
а так то, пусть будет хоть миллион потоков, если они выполняются так, что общие ресурсы "трогают" каждый строго в свое время, без пересечений, то никакие синхронизации не нужны.
2-то уж точно не показатель.
KSergey (2012-04-28 08:24:00) [8]> sniknik © (28.04.12 07:44) [21]
> .. да и то не сразу, а как база некий критический объем
> набрала (не справлялось 6-е с удалением, по чуть чуть но росла база).
Это не про то эксперимент, это про производительность БД.
sniknik (2012-04-28 07:44:00) [9]> Два потока, используя одно соединение непрерывно изменяют таблицу. Все работает.
одно соединение скорее всего само организует очередь команд независимо от "твоих" потоков. да и мало 2х для тестов... давно делал тест для проверки аксесс (по умолчанию/настроено 5 потоков/соединений держит), так 5 машин (именно с разных машин, вс на одной эффекта не давало) у меня непрерывно вело запись в базу, и одна (6-е, лишнее соединение) их удаляла... и оставлял я эту "систему" на три дня выходных... после смотрел по логам ошибки. и было их где то 1 на 1000 итераций... да и то не сразу, а как база некий критический объем набрала (не справлялось 6-е с удалением, по чуть чуть но росла база).
и это с ограниченным "локальным" движком, использовав в сети... а вот как можно нагрузить MSSQL например, так чтобы он начал "глюкать" даже не представляю...
хочешь реальную много поточность в ADO, делай либо отдельными коннектами в потоках, либо средствами самого ADO (имхо предпочтительнее).
yurikon (2012-04-27 18:21:00) [10]Докладываю, сделал тест. Два потока, используя одно соединение непрерывно изменяют таблицу. Все работает.
Но все равно для потока сделал свое соединение...
Медвежонок Пятачок (2012-04-27 17:44:00) [11]может и можно, только не нужно. в каком потоке создал адошные экземпляры - в том и юзай.
yurikon (2012-04-27 17:40:00) [12]
> конечно не гуи. только через пять минут окажется что это
> листбокс.
Чувствуется почерк мастера ;-))))). Memo, а так почти в точку.
Так что на счет ADO ?
Медвежонок Пятачок (2012-04-27 17:30:00) [13]TStringList - это не GUI.
конечно не гуи. только через пять минут окажется что это листбокс.
иначе зачем вести лог в стринглисте?
ах да, у него же есть кошерный метод сэйвтуфайл.
yurikon (2012-04-27 17:24:00) [14]
> Но надо понимать, что если собственно логирование занимает
> заметное (или основное) время работы потоков - то фактически
> этим параллельность вы убиваете.
Спасибо за пояснение. Нет, логирование не занимает много ресурсов потока.
С этим понял. Еще вопрос.
Я использую ADOConnection.Execute(..);
Можно ли делать вызов Execute одного соединения одновременно в двух разных потоках? В хелпе вроде как написано, что ADO потокобезопасный.
KSergey (2012-04-27 17:10:00) [15]> yurikon (27.04.12 17:00) [12]
> Synhronize(...) - этот или есть еще другой?
Да он.
Но надо понимать, что если собственно логирование занимает заметное (или основное) время работы потоков - то фактически этим параллельность вы убиваете.
Впрочем, любым другим методом синхронизации - тоже.
Чтобы потоки работали параллельно и одновременно (сейчас не будет углубляться в кванты времени) - надо минимизировать модификацию ими одних и тех же данных, в лучше всего - и вовсе исключить. Иначе на синхронизации весь кайф будет потерян.
KSergey (2012-04-27 17:07:00) [16]> yurikon (27.04.12 16:13) [7]
> Есть два потока, они вызывают одну и ту же процедуру, которая
> добавляет строку в TStringList (простой вариант логирования).
> Требуется ли в таком случае использовать критическую секцию?
Вы ведь писали:
> yurikon (13.04.12 11:38)
> Прочитал всю справку делфи по потокам. Трабл с одновременной работой с данными мне понятен.
Если речь про один и то же экземпляр TStringList, тогда то, о чем вы спрашиваете - и есть "одновременная работа с данными" из разных потоков
KSergey (2012-04-27 17:05:00) [17]> Медвежонок Пятачок © (27.04.12 16:30) [9]
> Из вторичных потоков нельзя трогать гуи.
TStringList - это не GUI.
yurikon (2012-04-27 17:00:00) [18]
> архангельский синхронайз
В смысле "архангельский синхронайз" ?
Synhronize(...) - этот или есть еще другой?
Медвежонок Пятачок (2012-04-27 16:58:00) [19]сенд/пост мессадж, архангельский синхронайз,.....
мильон способов.
yurikon (2012-04-27 16:57:00) [20]Просто с крит. секцией прога виснет, хотя делаю как в хелпе. Ок. Разберусь.
2 Медвежонок Пятачок:
Поясните, плиз, как в таком случае из потока передать инфо в основную прогу?
С уважением.