Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / В потоке ошибка с SQL / 25 сообщений из 29, страница 1 из 2
30.11.2017, 14:05:42
    #39561937
kamero
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
В потоке ошибка с SQL
Создаю службу. Есть главный и 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
30.11.2017, 14:12:39
    #39561944
goldmi45
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
В потоке ошибка с SQL
kamero,

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

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

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

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

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

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

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

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

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

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

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

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

Но вы должны понимать, что если вы работаете без pool то одно подключение к БД и якобы параллельно 20 запросов - это 20 запросов по очереди.
Сервер БД не умеет от одной сессии делать N запросов параллельно.
...
Рейтинг: 0 / 0
30.11.2017, 15:49:12
    #39562026
kamero
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
В потоке ошибка с SQL
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
30.11.2017, 15:50:26
    #39562027
goldmi45
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
В потоке ошибка с SQL
kameroDarkMaster,

В OnCreate происходит подкл. к БД (И делается одна запись в БД, ну и при закрытии то же самое). Потом создаются 2 потока, примерно идентичные. И дабы не воять новые подключения к БД. Я решил с главного потока взять подключение к БД. Как бы синхронизация между главным и этими двумя не нужна.
Это вы так считаете. Но если вы используете общую память (а компоненты ведь в ней располагаются), то просто обязаны синхронизировать эти данные. Проще всего будет создавать в каждом потоке своё подключение, транзакции и только их и использовать.
...
Рейтинг: 0 / 0
30.11.2017, 15:51:17
    #39562028
kamero
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
В потоке ошибка с SQL
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
30.11.2017, 15:58:56
    #39562034
goldmi45
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
В потоке ошибка с SQL
kamero,

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

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

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

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

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

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

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

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

Да с этим то всё понятно)) Тут вопрос в этих двух потоках которые должны работать одновременно))
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / В потоке ошибка с SQL / 25 сообщений из 29, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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