powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / IBX & TThread
45 сообщений из 45, показаны все 2 страниц
IBX & TThread
    #32355173
zahodun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вопрос по использованию коннекта к базе в отдельном потоке. Хотел бы узнать кто как это делает. Например, если я внутри класса TThread объявляю DataModul с компонентами IBX. При создании потока, создаю дата модуль, подключаюсь к базе (CB6\IBX, FB1.5). Когда хочу получить данные, то из основного потока заполняю DataSet.SQL и назначаю для DBGrid, который расположен в "основном VCL" потоке DataSet из вторичного потока, после чего активирую EVent, которого ждет "тело" потока. В потоке происходит запрос и на DBGride вижу данные, пока внутри тела потока не сделаю Commit || Rollback. Запрос не модифицирующий (только просмотр). Вроде все работает, но все же у меня вопрос - можно ли так делать? Ведь получается, что напрямую взаимодействуют компоненты, "живущие" в разных потоках. И как быть, если надо будет не только смотреть но и редактировать? В общем, хотелось бы, ссылки на статью или "хороший" исходник с помощью которого я бы прояснил для себя полностью ситуацию с тем, как грамотно организовать клиента, в котором обмен с сервером идет в потоке (потоках) параллельному основному.
Заранее спасибо всем кто откликнется...
...
Рейтинг: 0 / 0
IBX & TThread
    #32355207
Gold
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Посмотри на ibase.ru - там есть статья с примером на эту тему.
...
Рейтинг: 0 / 0
IBX & TThread
    #32355351
zahodun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Видел я и статью и исходник. Там делается так: в основном потоке находится StringGrid, указатель на который передается в поток и строки грида заполняются с помощью Synchronize, но это не совсем то. С таким же успехом можно передать массив строк и переменных, которые я потом вставлю в Edit-ы и Box-ы. Только нафига такое надо? Зачем тогда нужны все эти визуальные компоненты по работе с данными?
...
Рейтинг: 0 / 0
IBX & TThread
    #32355366
Фотография Alexey Kovyazin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
по моему, будут проблемы, так как gds32 не поддерживает многопоточный доступ.
Но лучше всего проверить это дело на хорошем тесте и нам тут сообщить, что да как - очень интересно.

With best regards,
Alexey Kovyazin
...
Рейтинг: 0 / 0
IBX & TThread
    #32355380
Gold
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне тоже надо распараллелить кое что, но оно не срочно пока и я никак не собирусь это попробовать. Так что помочь не могу :-/
...
Рейтинг: 0 / 0
IBX & TThread
    #32355409
zahodun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сейчас у меня сделано так: Основной VCL-поток порождает два дочерних, которые работают один на прием, другой на передачу данных на сервер. В принципе, почти работает.... "Почти" заключается в том, что иной раз возникает проблема со "StartTranzaction". Теперь думаю изменить программу так, чтобы параллельный поток был один, хотя по логике задачи и структуре программы их должно быть два. В общем-то сначала нужно хотя бы один заставить стабильно работать, а дальше погляжу...
...
Рейтинг: 0 / 0
IBX & TThread
    #32355479
Фотография Константин Хлопов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Господа, главное, что не многопоточен VCL!
Из другого потока нельзя даже ShowMessage сделать.
У меня по этому поводу были мысли даже вместо VCL для части задач использовать просто С++ wrapper для gds32.
Можно, конечно вызывать через Synchronize, но тогда теряется весь смысл много поточности (интерфейс "подвисает").
...
Рейтинг: 0 / 0
IBX & TThread
    #32355519
zahodun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Почему смысл многопоточности пропадает? Например, у меня "длинный" запрос к базе, но в основном потоке должна идти обработка другой информации. А по завершению запроса нужно вернуть одну строку. Тогда Synchronize в самый раз. Потоку данные передал, запустил его и занимайся своими делами. Как транзакция отработала - получи результат "синхронно". Только вот, если гриды нужно в основной форме иметь, тогда да... :(
...
Рейтинг: 0 / 0
IBX & TThread
    #32355662
Фотография Константин Хлопов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хммм... выполнение запроса из другого потока?
BCB HelpWhen you use objects from the VCL object hierarchy, their properties and methods are not guaranteed to be thread-safe. That is, accessing properties or executing methods may perform some actions that use memory which is not protected from the actions of other threads
Ой... как бы не нарваться...
Правда скорее всего это связано именно с отображаемыми компонентами (обычно подобного рода ошибки проявляются в виде Exc Canvas Doesn't allow drawing), но цитата из хелпа удерживает меня пока от работы с VCL из другого потока.
...
Рейтинг: 0 / 0
IBX & TThread
    #32355725
zahodun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Отсюда неутешительный вывод: если хочешь работать с потоками, то про визулизацию придется забыть :( или реализовывать её своими способами, передавая данные, например, используя критические секции... вдвойне :((
...
Рейтинг: 0 / 0
IBX & TThread
    #32355756
Фотография Константин Хлопов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zahodunили реализовывать её своими способами, передавая данные, например, используя критические секции
Дык... В том то и дело, что НЕТ. Даже если внутри твоей проги доступ к Form1->Label1 Синхронизирован (ты точно знаешь, что в каждый момент времени менять ее могит только 1 поток), то все равно ничего не получится, просто Form1->Label1->Text = "blabla" - это уже потоконебезопасно.
Т.е. ты НЕ имеешь права включить такую строку в код, исполняемый в твоем потоке ( даже косвенно, например TThread1->RefreshForm(), который вызывает Form1->UpdateLabel1(), в котором есть эта сторока) ).
Ота!
...
Рейтинг: 0 / 0
IBX & TThread
    #32355768
Фотография Константин Хлопов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ура! Все не так плохо.
BCB HelpData access components are thread-safe as follows: For BDE-enabled datasets, each thread must have its own database session component. The one exception to this is when you are using Access drivers, which are built using a Microsoft library that is not thread-safe. ADO and InterbaseExpress components are thread-safe.
Так что век живи век читай help.
...
Рейтинг: 0 / 0
IBX & TThread
    #32355847
zahodun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Теперь еще нужно опытным путем выяснить насколько оно "safe". А то в хелпе написать можно чего угодно... :)
...
Рейтинг: 0 / 0
IBX & TThread
    #32356157
StarWind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Константин Хлопов
прежде чем утверждать о возможности многопоточного VCL... нужно вообще знать в чем траблы и когда возникают....
в твоем примере с label'ом... один поток пишет в буферную переменную а второй поток читает из нее в label... разумеется и чтение и запись закрыты критическими секциями, а выигрыш в многопоточности есть. Ты можешь исполнять запрос скажем минуту в отдельном потоке и в это же время заниматься другими вещами. Если этих "других вещей" нет, то нехрен многопоточник городить.

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

Alexey Kovyazin
по поводу "gds32 не поддерживает многопоточный доступ"... Странно... Во-первых, я это использую, причем тестировал в режиме когда это удовольствие обязано было свалится... Да и потом... dll одна... а приложения запускаем два... уже получилась многопоточность...
...
Рейтинг: 0 / 0
IBX & TThread
    #32356386
Фотография Константин Хлопов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ню-ню...
пример
текст метода Execute единственного пользовательского потока:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
   int i( 0 );
   while(!Terminated)
   {
     Form1->Label1->Caption =  "Test"  + IntToStr(i);
     Form1->Label2->Caption = Form1->Label1->Caption;
     ShowMessage( Form1->Label2->Caption );
     i++;
   }

~300 нормальных вызовов потом Exception.
...
Рейтинг: 0 / 0
IBX & TThread
    #32356404
zahodun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 Константин Холопов

Так нельзя!

Нужно:

TThread::ShowCaption()
{
ShowMessage(...Caption);
}


TThread::Execute
{
while(..)
{
....
Synchronise(ShowCaption);

}
}
...
Рейтинг: 0 / 0
IBX & TThread
    #32356471
Фотография Константин Хлопов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот именно!
Любые операции с компонентами которые ЯВНО не классифицированы как многопоточные можно производить только из основного потока приложения (что и делает Synchronize). Но Message LOOP тоже работает в основном потоке.
Поэтому вызов тяжелой ф-и через Synchronize сводит на нет использование потока. Понятно, что все это шаманством всяким можно обойти...
...
Рейтинг: 0 / 0
IBX & TThread
    #32356522
zahodun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот-вот. Для "тяжелых" функций я и применяю буфер, защищенный критической секцией. Когда то обычный - линейный. Иногда удобно кольцевой. А вот как быть с DB? Фиг его знает. Заталкивать Select в array, потом выковыривать, отображать. После чего заталкивать в буфер Update или Insert и опять в поток? Уж больно навороченно получается. Как правило, если в программе столько наворотов, то и стабильность у нее обратно пропорциональная. А деваться некуда. Мой "клиент" кроме работы с сервером IB еще является и клиентом другого "реал-тайм" сервера. Обмен с которым идет напрямую по IP синхронно. Пакет - ответ. И я не могу себе позволить, чтобы обмен прекратился или задержался даже на секунду, а запрос к базе вполне может длиться и несколько секунд. Вот такие пироги...
...
Рейтинг: 0 / 0
IBX & TThread
    #32356550
Фотография Константин Хлопов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А может общение с сервером выделить в поток?
...
Рейтинг: 0 / 0
IBX & TThread
    #32356659
zahodun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Те же яйца - вид сбоку :)

С сервера приходит состояния реальных объектов, которые нужно отображать, опять же в реальном времени. Кроме того, ими нужно управлять. И если базе всё равно - отдам я ей запись сейчас или несколько позже, то реальным объктам это очень даже критично. Если оператор нажал кнопку, то и реакция должна быть немедленной. Поэтому я решил, что именно это будет в основном потоке, а IB в дополнительном.
...
Рейтинг: 0 / 0
IBX & TThread
    #32357427
StarWind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Константин Хлопов

мда.....
это видно комне относилась "реализация" Execute.... По мойму я уже писал... что так нельзя...нужно перекрывать критическими секциями.... а ты снова за свое... Да и я не вижу смысла многозадачности, если тут происходит работа фактически в главном потоке... вот если у тебя было бы вместо тупого инкремента скажем разложение Фурье, то тут был бы выигрыш...

zahodun

для твоего случая... работает у меня подобная штука и на удивление стабильно и безотказно. Да и время очень жестко задано. В терх потоках живет (погоди всеж в четерех) общение с прогой по телнету, чтение данных с COM-порта каждые 100мс и общение с базой, которое может затянуться и на секунду и даже подольше... При том что результат чтения отображается в окне и в принципе я думаю можно редактирование прикрутить. А ларчик просто открывается. Например в потоке 1 тебе надо чтоб была форма (подчеркиваю это не главный поток в обычном понимании). Тогда ты именно в этом потоке создаешь форму (create) и в нем же даешь команду на отображение (show). Далее, дабы й тебя поток не прекратил свое существование слишком оперативно (то есть сразу после создания формы) оформляешь следующую последовательность команд:

Код: plaintext
1.
2.
3.
4.
while true do
begin
 Application.ProgressMessages;
 Sleep( 0 );
end;


синтаксис дельфей, но думаю переведешь. Sleep обязательно, дабы проток не грузил комп по напрасну. Можно этим спипом рулить приоритет своеобразно весьма. Разумеется, если мы завершаем поток, то необходимо убить форму. Точно так же можно создавать сколь угодно много форм. Причем разумеется в одном потоке. Объмен информацией между потоками я осуществляю через очередь. сразу предупрежу. Та что идет стандартно нельзя использовать, так как не поддерживает многопоточность. Я писал свою, если надо поделюсь, но разумеется написана на дельфе.
И в заключении скажу, что вся эта конструкция работает дополнительно и в dll и прекрасно функционирует.
...
Рейтинг: 0 / 0
IBX & TThread
    #32357515
zahodun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
StarWind

Раз у тебя все так здорово работает, то может тогда прояснишь мне несколько моментов насчет многопоточности? :))

Вот ты говоришь, что нужно создавать форму внутри потока. У меня и ДатаМодуль тоже создается внутри потока, но я только сейчас подумал. А внутри ли? Т.е. сейчас сделано так:
class TIBThread : public TThread
{
private
...
TReadDM * DM; // DataModul
...
}

Но создаю я его не внутри Execute, а при создании потока.

TIBThread::TIBThread(bool CreateSuspended)
{
...
DM = new TReadDM;
}

Разваливаю естественно, тоже в деструкторе Thread`a.

Но скорее всего получается, что при таком подходе модули создаются в основном потоке? Может нужно реализовать все создания подключения/отключения/разваливание внутри метода Execute? В общем, что-то я вконец запутался с этими потоками. Да и в литературе этот вопрос что-то слабо освещен.
...
Рейтинг: 0 / 0
IBX & TThread
    #32357568
StarWind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
датамодуль это просто контейнер и все. У него нет собственной очереди сообщений, поэтому вообще говоря не важно где его создавать. Я говорил все в отношении форм где и происходят все накладки при одновременном доступе из двух потоков. Если ты подменишь датамодуль на форму, то тут уже можно говрить осмыслено и в твоем случае форма окажется "привязана" к главному потоку. Привязана именно очередью.
Немного проясню откуда все траблы. Например мы пытаемся модифицировать label во втором потоке. При присваивании значения, оно автоматически отображается на форме и пишется в некую область памяти. В самый неприятный момент в очередь главного потока падает событие WM_PAINT, которое заставляет перерисоваться окно и соответственно и изменить информацию в той же самой области памяти, где и шарится второй поток. В итоге, происходят вещи, предсказать которые, крайне трудно.
Что происходит в случае когда окно создано и показано в коде второго потока? Ничего страшного кроме провязывания внутренних переменных библиотеки VCL и WinAPI. Когда же мы принудительно вызываем функцию ProgressMessages происходит обработка событий в очередях тех окон, которые созданы именно в этом потоке, откуда был вызов . В итоге, мы получаем, что работой окна управляет именнонаш вторичный поток и не касается его главный. Для доказательства, можно заблокировать цикл который я приводил, остановив тем самым второй поток. ОКНО ОБНОВЛЯТЬСЯ НЕ БУДЕТ Это я проверял и в принципе и дошел до этих идей именно через подобные тесты. (плюс хелп разумеется)

Теперь о твое проблеме. Рисуем в дизайнере нужную нам форму, со всеми элементами редактирования и прочего. Если нужен датамодуль, то можем создавать его где угодно(только разумеется он должен быть создан перед тем как его форма будет юзать, это важно отследить) либо в этой же форме. А потом создаем и показываем форму в функции потока. Все будет работать железно. Потому как это будет фактически однопоточник. Но я бы не советовал юзать компоненты, которые юзаются в форме в другом потоке. Иначе мы напоримся на те же грабли. Обмен можно осуществлять через очередь, но подчеркну еще раз стандартную очередь (компонента TQueue) использовать нельзя. Она не предназначена для обращения к ней из многих потоков, только внутри одного.
...
Рейтинг: 0 / 0
IBX & TThread
    #32357640
Roman Ignatiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну зачем же так мучится? Если у вас есть TClientDataset, то проблема с потоками решается очень просто: Да, в потоке создаете модуль данных, с запросом и провайдером. Подсоединяетесь, выполняете запрос. Потом просто: передаете данные из провайдера в cds в главном потоке, к которой присоединена форма, эти данные - простой OleVariant.
...
Рейтинг: 0 / 0
IBX & TThread
    #32357809
zahodun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
To StarWind

Большое спасибо за разъяснение, только непонятно следующее:

...
Но я бы не советовал юзать компоненты, которые юзаются в форме в другом потоке. Иначе мы напоримся на те же грабли. Обмен можно осуществлять через очередь, но подчеркну еще раз стандартную очередь (компонента TQueue) использовать нельзя. Она не предназначена для обращения к ней из многих потоков, только внутри одного.
...

- 1) не понял, в каком смысле это написано? Что значит юзать компоненты, которые юзаются в другом потоке?

- 2) Если нельзя использовать очередь компонента, тогда как? Выдумывать "свою" очередь, защищенную критической секцией?

To Roman Ignatiev
...
Потом просто: передаете данные из провайдера в cds в главном потоке, к которой присоединена форма, эти данные - простой OleVariant.
...
- это как?
...
Рейтинг: 0 / 0
IBX & TThread
    #32357842
Roman Ignatiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну на Delphi примерно так:
var
ProvOptions: TGetRecordOptions;
DataPacket: OleVariant;

ProvOptions := [grMetadata, grReset];
DataPacket := dspOut.GetRecords(-1,RecsOut,Byte(ProvOptions));

Опции - как надо, а TDatasetProvider (dspOut), ессно, должен быть присоединен к датасету. Все, данные (и метаданные!) - в переменной, теперь просто из потока через Syncronize остается присвоить DataPacket свойству TClientDataset.Data в основном потоке, и сделать ей Active := true. Можно и частями данные передавать, но это уже в хелпе посмотри :)
...
Рейтинг: 0 / 0
IBX & TThread
    #32358743
StarWind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сорри, наверное запутанно объяснил

1) На форме например объявлено Q:TIBQuery. Ты его юзаешь во втором потоке. Так вот в первом потоке не рекомендую обращаться к Q.

2) Очередь придется писать свою, о чем я и пытаюсь сказать уже в трех мессагах :)). Написать ее не составляет труда, это обычная лаба в любом вузе. А вот тонкости синхронизации. Вобщем предложу еще раз посмотреть код моей :))

Не уверен что будет проще то что предлагает Roman Ignatiev ... В том что я предлагаю, ты можешь на форме делать все что угодно. Как в обычном приложении. В тоже время то что предлагается Романом надо будет отдельно отрабатывать для каждого запроса...
...
Рейтинг: 0 / 0
IBX & TThread
    #32359428
Фотография Константин Хлопов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2StarWind
Я думаю, ты догадываешься, что приведенный пример не более чем тест.
И где ты там предлагаешь ставить Critical Section?

Не вопрос, согласен, обработка WM в том же потоке должна решить проблему.
Но раньше и речи об этом не было.
...
Рейтинг: 0 / 0
IBX & TThread
    #32360291
StarWind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Константин Хлопов

критическая секция ставится для разграничения доступа к участку кода.
так что первый поток вычисляяет значение переменной и в критической секции присваивает это значение в буферную переменную . Второй поток (который оторажает данные) может функционировать например так: через определенное время в критической секции считывает значение из буферной переменной на экран . Вот и все
...
Рейтинг: 0 / 0
IBX & TThread
    #32360466
Фотография Константин Хлопов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Но, насколько я понимаю, не переписывая обработку оконных сообщений сделать этого нельзя.
...
Рейтинг: 0 / 0
IBX & TThread
    #32360561
StarWind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это можно сделать и более чем просто
никаких траблов

// код функции вычисления чего-то долгоиграющего
...
result:=BigFunct;
EnterCriticalSection(CriticalSection);
buf:=result;
LeaveCriticalSection(CriticalSection);
...

// код функции отображения
...
EnterCriticalSection(CriticalSection);
Label1.Caption:=buf;
LeaveCriticalSection(CriticalSection);
...

и в чем проблемы?
...
Рейтинг: 0 / 0
IBX & TThread
    #32360648
chevychelov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Дышите глубже, пролетаем сочи! :))
Говорю как человек сделавший компонент для доступа к Firebird через потоки.
В потоке
IBDataBase, IBTransaction, IBDataSet.
Как один из входных параметров процедуры запуска потока указатель DataSource (TDataSource) в который надо вернуть данные. DataSource - другой поток, другая форма, общий только процесс.
В потоке:
подключились,
выполнили запрос
в Synchronize написали DataSource.DataSet := IBDataSet
выполнили Supend;
Спокойно работаем через DBEdit, DBGrid и пр. и редактируем данные.
При необходимости используем поток повторно.

У меня компонент - отдельная бибилиотека (COM объект) поэтому необходимо использовать sharemem.
Единственные проблемы c DBGrid, перед перед повторным использованием потока DBGrid.DataSource := nil, после того как поток отработал DBGrid.DataSource := DataSource.

Удачи!
...
Рейтинг: 0 / 0
IBX & TThread
    #32360861
Фотография Константин Хлопов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 StarWind
Не спора ради а истины для...
Допустим, WM_PAINT приходит в "середине" кода отображения...
Сто пудов проблем не будет?
...
Рейтинг: 0 / 0
IBX & TThread
    #32361516
StarWind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а с какого счастья они будут? WM_PAINT может возникнуть когда угодно и будет прорисовывать данные из своих буферов. Даже если в самй протиыный момент, когда получаем результат функции... так тот результат попадает в буфер, а модуль отображения находится в том же самом потоке что и очередь сообщений.Между собой они разделены критической секцией... Вот и все

P.S. Прежде чем ввязываться в спор, нужно разбираться в этом
...
Рейтинг: 0 / 0
IBX & TThread
    #32361727
Фотография Константин Хлопов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где выполняется код функции отображения?

Если в приложении (кроме главного потока) еще только один, я что не имею права в его теле написать Form1->Label->Text = "blabla";?

И зачем мне вызывать методы через Synchronize, как не для того, чтобы синхронизироваться с обработкой оконных сообщений в главном потоке?
...
Рейтинг: 0 / 0
IBX & TThread
    #32362623
StarWind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EnterCriticalSection(CriticalSection);
Label1.Caption:=buf;
LeaveCriticalSection(CriticalSection);

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

метод Synchronize... Ну не люблю я класс TThread... Органическое отвращение к нему... Тем более читал в литературе, что в нем есть ряд глюков... Так что юзайте WinAPI CreateThread
...
Рейтинг: 0 / 0
IBX & TThread
    #32362790
Roman Ignatiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не надо CreateThread. Это еще хуже. Надо BeginThread, иначе нарветесь, когда исключение возникнет. Кстати, TThread в D6 вполне нормально реализован, и неплохо работает.
...
Рейтинг: 0 / 0
IBX & TThread
    #32362803
StarWind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Именно про D6 разговор и велся, конкретно про функцию WaitFor.
В пятом (на котором работаю) мне не понравилась реализация метода Terminate.
а CreateThread это между прочим WinAPI... И именно через нее все и работает... в том числе и BeginThread. Причем вызывает она напрямую именно эту функцию
...
Рейтинг: 0 / 0
IBX & TThread
    #32362806
StarWind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да и еще, исключения нужно вовремя перехватывать, особенн при работе с dll
...
Рейтинг: 0 / 0
IBX & TThread
    #32362823
Roman Ignatiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не напрямую, BeginThread делает две вещи:
BeginThread encapsulates the Win32 CreateThread API call, but unlike CreateThread, it sets the global IsMultiThread variable, thereby making the heap thread-safe.
Thread functions should handle all of their own exceptions. BeginThread sets up an exception frame that allows the system's default exception handler to catch any of the thread's exceptions that have not been handled.
Они достаточно важны.
А вообще говоря, если можно без потока - надо делать без потока, особенно на клиенте. У меня вообще явно многопоточных клиентов нет.
Можно еще использовать COM + ADO, там все вам сделают через интерфейсы
...
Рейтинг: 0 / 0
IBX & TThread
    #32363891
StarWind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
function BeginThread(SecurityAttributes: Pointer; StackSize: LongWord;
ThreadFunc: TThreadFunc; Parameter: Pointer; CreationFlags: LongWord;
var ThreadId: LongWord): Integer;
var
P: PThreadRec;
begin
New(P);
P.Func := ThreadFunc;
P.Parameter := Parameter;
IsMultiThread := TRUE;
Result := CreateThread(SecurityAttributes, StackSize, @ThreadWrapper, P,
CreationFlags, ThreadID);
end;

это ее код )
и что тут высокоинтелектуального?
...
Рейтинг: 0 / 0
IBX & TThread
    #32363898
StarWind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а по поводу использовать или нет многопоточник
нужно было читать ветку с начала... там весьма веские аргументы
...
Рейтинг: 0 / 0
IBX & TThread
    #32363979
zahodun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Извиняюсь, что создал ветку и долго не появлялся - был в командировке. Сейчас попытаюсь на основе всех полученных данных и сформировавшейся в голове схемы построить что-нибудь работающее :))
...
Рейтинг: 0 / 0
IBX & TThread
    #32364099
Roman Ignatiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2StarWind Интеллектуального в BeginThread два слова: isMultiThread и ThreadWrapper, эти две вещи и делают то, что написано в справке по BeginThread. Никто не говорит, что нельзя обойтись CreateThread, но тогда уж и мультипоточность сами объявляйте, и все исключения перехватывайте в теле потока. А зачем? Чем меньше пишешь, тем лучше. Многие компоненты работают с потомками TThread, и могу сказать, очень неплохо работают.
А вот в необходимости потоков я глубоко сомневаюсь, их вполне можно заменить процессами, иногда это даже проще. И передача данных таблиц между процессами, как и между потоками, не так уж сложна. У меня просто уже давно все визуальные компоненты работают с TClientDataset, и только с ней. Результат - в нее можно передать пакет данных откуда угодно, из файла (можно XML), через Variant, из другого датасета через провайдер.
Как я и писал выше, передача через Variant как раз и подходит для межпоточного взаимодействия, сформировал пакет, запомнил в переменной, и через Syncronize его передал прямо в cds в основном потоке. Все, работай дальше.
Преимущества? Провайдер сам следит и за транзакцией, и за запросом, ты пишешь несколько строк всего, не особо задумываясь, потоки у тебя или нет. Плюс в cds есть куча маленьких удобств для реализации интерфейса, это и индексация "на лету", и дополнительные поля данных, и возможность отката изменений...
...
Рейтинг: 0 / 0
IBX & TThread
    #32365619
StarWind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все исключения и так у меня перехватываются (их попросту некому показывать на консоли сервера) да и вообще они должны перехватываться, чтобы не вгонять юзера в ступор непонятными фразами. Индикатор многопоточности... так я это и сам знаю , а VCL у меня работает в однопоточном режиме и так :))
Заменять процессами....
контекст процесса гораздо больше чем контекст потока и соответственно время на переключение так же. Синхронизация процессов несоизмеримо медленее синхронизации потоковну и плюс к тому общая память и соответственно обмен данными. Между процессами тоже можно подобное сделать, но это не так удобно и главное это медленно. Ну и последний довод. Если в windows есть понятие потока, значит он эффективнее, если приложение подразумевается как многопоточное, чем "многопроцессовое" приложение. Кстате, есть операционки где потоки отстутствуют как класс. Например QNX.
...
Рейтинг: 0 / 0
45 сообщений из 45, показаны все 2 страниц
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / IBX & TThread
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]