powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / В потоке ошибка с SQL
29 сообщений из 29, показаны все 2 страниц
В потоке ошибка с SQL
    #39561937
kamero
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Создаю службу. Есть главный и 2 отдельных потока. Компоненты находятся на форме типа (DataModule). Не помню как она называется)).
Из потока хочу сделать вставку. И конечно же выбивает ошибку по адресу...
Просто странно компоненты он видит и тд. Компилится. Но бьёт по адресу...

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
    if not VarIsNull(FEventResult1) then
    begin
      MSServisPK.ADQuery1.Connection := MSServisPK.ADConnection1; // Вот тут и сл. 3 строчки.
      MSServisPK.ADQuery1.Transaction := MSServisPK.ADTransaction1;
      MSServisPK.ADQuery1.Transaction.StartTransaction;
        try
          MSServisPK.ADQuery1.Close;
          MSServisPK.ADQuery1.SQL.Text := 'Insert into process (Caption, Status, Date_Time, ProcessId, ExecutablePath)'
                                      +' values (:pCaption, :pStatus, :pDate_Time, :pProcessId, :pExecutablePath);';
          MSServisPK.ADQuery1.Prepare;
          MSServisPK.ADQuery1.ParamByName('pCaption').AsString := FEventResult1.TargetInstance.Caption;
          MSServisPK.ADQuery1.ParamByName('pStatus').AsString := 'Çàïóñê';
          MSServisPK.ADQuery1.ParamByName('pDate_Time').AsDateTime := Now;
          MSServisPK.ADQuery1.ParamByName('pProcessId').AsString := FEventResult1.TargetInstance.ProcessId;
          MSServisPK.ADQuery1.ParamByName('pExecutablePath').AsString := FEventResult1.TargetInstance.ExecutablePath;
          MSServisPK.ADQuery1.ExecSQL;
          MSServisPK.ADQuery1.Transaction.Commit;
        except
          MSServisPK.ADQuery1.Transaction.Rollback;
        end;
    end;
    FEventResult1 :=Unassigned;
...
Рейтинг: 0 / 0
В потоке ошибка с SQL
    #39561944
goldmi45
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kamero,

Текст ошибки-то какой? Телепатов нет.
...
Рейтинг: 0 / 0
В потоке ошибка с SQL
    #39561947
goldmi45
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kamero,

И я очень надеюсь, что MSServisPK - это не TDataModule, который общий (т.е. виден из всех потоков), и который используется всеми потоками.
...
Рейтинг: 0 / 0
В потоке ошибка с SQL
    #39561950
kamero
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
goldmi45,

MSServisPK это подобие датамодуля(не видимая форма). Короче при создании Applcation Service. Создаётся по умолчанию эта форма. (TService).
...
Рейтинг: 0 / 0
В потоке ошибка с SQL
    #39561952
kamero
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kamero,

Вот текст ошибки.

Потоки создаются в момент OnCreate.
...
Рейтинг: 0 / 0
В потоке ошибка с SQL
    #39561953
kamero
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kamero,

Запрос находится в потоке а компоненты на этой форме. Беда где-то тут))
...
Рейтинг: 0 / 0
В потоке ошибка с SQL
    #39561958
goldmi45
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kamero,

Вы представляете, что будет, если один поток запустит транзакцию и установит у компонента ADQuery1 текст запроса, а потом другой поток сделает то же самое?
Или делайте синхронизацию, или у каждого потока должен быть свои компоненты доступа.
...
Рейтинг: 0 / 0
В потоке ошибка с SQL
    #39561964
kamero
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
goldmi45,

Так что придется в каждом потоке делать подключение к бд и тд?!
...
Рейтинг: 0 / 0
В потоке ошибка с SQL
    #39561970
dartveider13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я в своем многопоточном приложении создавал отдельные компоненты как подключения так и всего остального. Максимум что я вызывал из главного потока это значения контролов для установки настроек для компонентов и через синхронизацию писал лог, обновлял леблы.
...
Рейтинг: 0 / 0
В потоке ошибка с SQL
    #39561979
goldmi45
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kamerogoldmi45,

Так что придется в каждом потоке делать подключение к бд и тд?!
Ну не делайте, раз это вас пугает.
...
Рейтинг: 0 / 0
В потоке ошибка с SQL
    #39561988
kamero
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
goldmi45,

Synchronize(Процедура1)?! И так можно синхронизировать 2 потока с основным?! Чтобы был доступ к компонентам?!
...
Рейтинг: 0 / 0
В потоке ошибка с SQL
    #39562008
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kamero,

Не страдайте ерундой, а делайте свое подключение и т.п. для каждого потока. И ответьте плиз на вопрос - назачем вам в Service синхронизация с главным потоком?
...
Рейтинг: 0 / 0
В потоке ошибка с SQL
    #39562015
kamero
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DarkMaster,

В OnCreate происходит подкл. к БД (И делается одна запись в БД, ну и при закрытии то же самое). Потом создаются 2 потока, примерно идентичные. И дабы не воять новые подключения к БД. Я решил с главного потока взять подключение к БД. Как бы синхронизация между главным и этими двумя не нужна.
...
Рейтинг: 0 / 0
В потоке ошибка с SQL
    #39562024
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ADO не threadsafe... надо самому делать.
FireDAC threadsafe он за вас это делает.

Но вы должны понимать, что если вы работаете без pool то одно подключение к БД и якобы параллельно 20 запросов - это 20 запросов по очереди.
Сервер БД не умеет от одной сессии делать N запросов параллельно.
...
Рейтинг: 0 / 0
В потоке ошибка с SQL
    #39562026
kamero
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X-Cite,

У меня не ADO. A AnyDAC. Прародитель FireDAC)))

Я добавил синхронизацию и теперь вижу только 1 поток... 2 поток не отрабатывает вообще не как)


Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
procedure TNewThread1.Execute;
begin
  Synchronize(Ins1);
end;

procedure TNewThread2.Execute;
begin
  Synchronize(Ins2);
end;
...
Рейтинг: 0 / 0
В потоке ошибка с SQL
    #39562027
goldmi45
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kameroDarkMaster,

В OnCreate происходит подкл. к БД (И делается одна запись в БД, ну и при закрытии то же самое). Потом создаются 2 потока, примерно идентичные. И дабы не воять новые подключения к БД. Я решил с главного потока взять подключение к БД. Как бы синхронизация между главным и этими двумя не нужна.
Это вы так считаете. Но если вы используете общую память (а компоненты ведь в ней располагаются), то просто обязаны синхронизировать эти данные. Проще всего будет создавать в каждом потоке своё подключение, транзакции и только их и использовать.
...
Рейтинг: 0 / 0
В потоке ошибка с SQL
    #39562028
kamero
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kamero,

Вот сам поток. Между собой они ни чем практически не отличаются. 2-3 момента по коду.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
procedure TNewThread2.Ins2;
const
  WbemUser            ='';
  WbemPassword        ='';
  WbemComputer        ='localhost';
  wbemFlagForwardOnly = $00000020;
  wbemErrTimedout     = $80043001;
var
  FSWbemLocator2 : OLEVariant;
  FWMIService2   : OLEVariant;
  FWbemObjectSet2: OLEVariant;
  FEventResult2  : OLEVariant;
begin
//CoInitialize(nil);
  FSWbemLocator2  := CreateOleObject('WbemScripting.SWbemLocator');
  FWMIService2    := FSWbemLocator2.ConnectServer(WbemComputer, 'root\CIMV2', WbemUser, WbemPassword);
  FWbemObjectSet2 := FWMIService2.ExecNotificationQuery('Select * from __InstanceDeletionEvent Within 1 Where TargetInstance ISA "Win32_Process"');

  while not false do
  begin
    try
     FEventResult2  := FWbemObjectSet2.NextEvent();
    except
     on E:EOleException do
     if EOleException(E).ErrorCode=HRESULT(wbemErrTimedout) then
        FEventResult2 :=Null;
     else
     raise;
    end;

    if not VarIsNull(FEventResult2) then
    begin
      MSServisPK.ADQuery2.Connection := MSServisPK.ADConnection1;
      MSServisPK.ADQuery2.Transaction := MSServisPK.ADTransaction1;
      MSServisPK.ADQuery2.Transaction.StartTransaction;
        try
          MSServisPK.ADQuery2.Close;
          MSServisPK.ADQuery2.Connection := MSServisPK.ADConnection1;
          MSServisPK.ADQuery2.Transaction := MSServisPK.ADTransaction1;
          MSServisPK.ADQuery2.SQL.Text := 'Insert into process (Caption, Status, Date_Time, ProcessId, ExecutablePath)'
                                      +' values (:pCaption, :pStatus, :pDate_Time, :pProcessId, :pExecutablePath);';
          MSServisPK.ADQuery2.prepare;
          MSServisPK.ADQuery2.ParamByName('pCaption').Value := FEventResult2.TargetInstance.Caption;
          MSServisPK.ADQuery2.ParamByName('pStatus').Value := 'Çàêðûòèå';
          MSServisPK.ADQuery2.ParamByName('pDate_Time').AsDateTime := Now;
          MSServisPK.ADQuery2.ParamByName('pProcessId').Value := FEventResult2.TargetInstance.ProcessId;
          MSServisPK.ADQuery2.ParamByName('pExecutablePath').Value := FEventResult2.TargetInstance.ExecutablePath;
          MSServisPK.ADQuery2.ExecSQL;
          MSServisPK.ADQuery2.Transaction.Commit;
        except
          MSServisPK.ADQuery2.Transaction.Rollback;
        end;
    end;
    FEventResult2 :=Unassigned;
  end;
//  CoUninitialize;
end;
...
Рейтинг: 0 / 0
В потоке ошибка с SQL
    #39562034
goldmi45
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kamero,

Если вы в Execute потока напишете только одну строку Synchronize(Ins1), то это означает, что поток будет выполняться не параллельно главному, а (фигурально выражаясь) в нем. Т.е. смысла в вашей многопоточности приложения - ноль.
...
Рейтинг: 0 / 0
В потоке ошибка с SQL
    #39562040
kamero
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
goldmi45,

Короче я понял что надо сделать но не знаю как)))

Объясню логику. Помогите с реализацией))
Создаётся главный в нём туда сюда 2 запроса. Один при запуске, другой при закрытии. В момент запуска создаются 2 потока. Первый отлавливает запуск приложений. Второй закрытие. Они должны работать параллельно. Так как оба ожидают своих событий. Они работают с той же базой что и основной. Как не создавая все компоненты с работой БД это реализовать?!
...
Рейтинг: 0 / 0
В потоке ошибка с SQL
    #39562041
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kameroКак не создавая все компоненты с работой БД это реализовать?!
На каждый поток проще и надежнее создавать все необходимые компоненты для соединения с БД.
Либо научить потоки "общаться" с главным, который и будет работать с базой.
...
Рейтинг: 0 / 0
В потоке ошибка с SQL
    #39562042
kamero
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kamero,

Вот по этому у меня только 1 поток и отрабатывает...

А вот можно еще наверное по другому. Сами запросы вынести в главный поток. А из этих двух дергать просто параметры и передавать их в этот запрос.
...
Рейтинг: 0 / 0
В потоке ошибка с SQL
    #39562046
goldmi45
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kamero,

Т.е., если по-человечески, вы хотите сохранять в базе время запуска сервиса и время окончания его работы. При этом есть два потока, один мониторит запуск(!), а второй завершение (??).
Почему бы не сделать в одном потоке, причём основном? В OnStart сервиса писать время запуска, в OnStop - время остановки.
Либо как у вас - потоки. Но потоки только для мониторинга факта наступления события, а запись в БД - в основном потоке.
...
Рейтинг: 0 / 0
В потоке ошибка с SQL
    #39562050
kamero
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
goldmi45,

В основном время запуска и завершения самого моего сервиса.
А в потоках идёт отлавливание сторонних процессов(Word, Chrome и тд). В первом время запуска процесса, а второй время остановки.
Они на протяжении всего времени ожидают своих событий(запуска или закрытия).
...
Рейтинг: 0 / 0
В потоке ошибка с SQL
    #39562054
goldmi45
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kamero,

Я бы не стал делать запись в БД во время остановки сервиса. Для того, чтобы записать в БД, нужен доступ к этой БД. А к ней в это время может и не быть доступа. К примеру - служба сервера остановлена уже, а ваша - только собирается останавливаться. Проще - время остановки сохранять в файл, а при старте его парсить и записывать время остановки.
...
Рейтинг: 0 / 0
В потоке ошибка с SQL
    #39562062
kamero
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
goldmi45,

Да с этим то всё понятно)) Тут вопрос в этих двух потоках которые должны работать одновременно))
...
Рейтинг: 0 / 0
В потоке ошибка с SQL
    #39562071
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kamerogoldmi45,

Да с этим то всё понятно)) Тут вопрос в этих двух потоках которые должны работать одновременно))

Два одновременных потока - это два коннекта к БД.
...
Рейтинг: 0 / 0
В потоке ошибка с SQL
    #39562075
kamero
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X-Cite,

Короче... ладно создам эти компоненты уже в потоке.
Просто мне кажется логичнее было бы просто получить данные из потока и в основном уже их вставить))
...
Рейтинг: 0 / 0
В потоке ошибка с SQL
    #39562141
Vlad F
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kamero,

Динамическое создание в каждом своих обособленных экземпляров соединения, транзакции и запроса явилось бы на самом деле самым простым и надежным решением. И заняло бы, наверное, не более получаса кодирования вместе с отладкой.
...
Рейтинг: 0 / 0
В потоке ошибка с SQL
    #39562218
kamero
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vlad F,
Да спасибо. Я так и сделал.
...
Рейтинг: 0 / 0
29 сообщений из 29, показаны все 2 страниц
Форумы / Delphi [игнор отключен] [закрыт для гостей] / В потоке ошибка с SQL
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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