Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Вопрос на понимание потоков [D7]


Страницы:   1 2

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 Медвежонок Пятачок:

Поясните, плиз, как в таком случае из потока передать инфо в основную прогу?

С уважением.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо