powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Запуск программ
61 сообщений из 61, показаны все 3 страниц
Запуск программ
    #39490435
Фотография Gallemar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый всем день
У меня такая проблема - пишу программу для запуска других приложений с всяческими проверками и мониторингами.
Такая проблема - мне надо, чтобы после получения настроек из ini запустили все программы одновременно, а они запускаются последовательно.
Код: 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.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs,IniFiles, StdCtrls, FIBQuery, pFIBQuery, FIBDatabase,
  pFIBDatabase;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    pFIBDatabase1: TpFIBDatabase;
    pFIBTransaction1: TpFIBTransaction;
    pFIBQuery1: TpFIBQuery;
    procedure Button1Click(Sender: TObject);

  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
    tpath2: string;
    tpath1: string;

implementation

{$R *.dfm}
Function RunAppAndWait(CmdLine, WorkDir: string): boolean;     //????????? ????????? ? ???????? ??????????
Var SI: TStartupInfo;
    PI : TProcessInformation;
Begin
   ZeroMemory(@SI, SizeOf(SI));
   SI.cb := SizeOf(SI);
   Result := CreateProcess(nil, PChar(CmdLine), nil, nil, false, 0, nil, PChar(WorkDir), SI, PI);
   If Result Then Begin
      CloseHandle(PI.hThread);
      WaitForSingleObject(PI.hProcess, INFINITE);
      CloseHandle(PI.hProcess)
   End
End;

procedure FileExi (FileDir, RunExe: string);
begin
RunAppAndWait (tpath2,tpath1);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
i : integer;
        fini: TIniFile;
        sections: TStringList;
        tpath3: string;
        start_time: tdatetime;
        stop_time: tdatetime;

begin
        memo1.Lines.Clear;
        fini:=TIniFile.Create(ExtractFilePath(Application.ExeName)+'init.ini');
        tpath3 := ExtractFilepath(Application.ExeName);
        sections := TStringList.Create;
        fini.ReadSections(sections);
        for i :=0 to (sections.Count)-1   do begin
              memo1.Lines.Add(fini.ReadString(sections[i],'source',''));
              memo1.Lines.Add(fini.ReadString(sections[i],'apppath',''));
              tpath1:=  fini.ReadString(sections[i],'source','');
              tpath2:=  fini.ReadString(sections[i],'apppath','');
              //здесь должна быть проверка, пока её нет
              //старт приложений, как делать запуск всех сразу? В голову пришла мысль о передаче параметров в массив,
               // а как - понять не могу, опыта не хватает.
              start_time := now;
              FileExi(tpath2,tpath1);
              stop_time := now;
              pFIBQuery1.SQL.Clear;
              pFIBQuery1.SQL.Add('insert into IMPORT_TIME_LOG (START1,STOP1,KIND) values (:START1,:STOP1,:KIND)');
              pFIBTransaction1.StartTransaction;
              pFIBQuery1.ParamByName('START1').Value:= start_time;
              pFIBQuery1.ParamByName('STOP1').Value:= stop_time;
              pFIBQuery1.ParamByName('KIND').Value:= 42;
              pFIBQuery1.ExecQuery();
              pFIBTransaction1.Commit;

                                            end;
end;

...
Рейтинг: 0 / 0
Запуск программ
    #39490444
Фотография JayDi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Метод называется RunAppAndWait, что как бы намекает, что мы запускаем приложение и ждем, пока оно завершится.

Чтобы не ждать, можно закомментировать вот эту строчку:
WaitForSingleObject(PI.hProcess, INFINITE);
...
Рейтинг: 0 / 0
Запуск программ
    #39490446
Фотография Gallemar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JaDiМетод называется RunAppAndWait, что как бы намекает, что мы запускаем приложение и ждем, пока оно завершится.

Чтобы не ждать, можно закомментировать вот эту строчку:
WaitForSingleObject(PI.hProcess, INFINITE);
Ну да
только тогда вот эта часть:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
stop_time := now;
              pFIBQuery1.SQL.Clear;
              pFIBQuery1.SQL.Add('insert into IMPORT_TIME_LOG (START1,STOP1,KIND) values (:START1,:STOP1,:KIND)');
              pFIBTransaction1.StartTransaction;
              pFIBQuery1.ParamByName('START1').Value:= start_time;
              pFIBQuery1.ParamByName('STOP1').Value:= stop_time;
              pFIBQuery1.ParamByName('KIND').Value:= 42;
              pFIBQuery1.ExecQuery();
              pFIBTransaction1.Commit;


сработает сразу же после старта приложения, а мне нужна информация о её конце,это важно.
...
Рейтинг: 0 / 0
Запуск программ
    #39490489
Фотография JayDi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gallemar,

Тогда можно через потоки сделать (запускаем отдельный поток, которые отвечает за внешнее приложение и ждет его завершения). Какая версия делфи? В новых можно использовать встроенную TParallel.For, стороннюю библиотеку OmniThreadLibrary (рекомендую), прямо средствами делфи через TThread . Можно даже без всяких потоков сделать -- обычным циклом с ожиданием (запускаем по списку, сохраняем хендлы процессов hProcess и по очереди проверяем их окончания, записывая результат и ожидая закрытия всех процессов).
...
Рейтинг: 0 / 0
Запуск программ
    #39490524
Фотография Gallemar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JaDiGallemar,
Какая версия делфи?
Классика - №7.
...
Рейтинг: 0 / 0
Запуск программ
    #39490543
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GallemarJaDiGallemar,
Какая версия делфи?
Классика - №7.
Как сделал-бы я. :)
Код: 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.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
type

    { TForm1 }

    TForm1 = class(TForm)
    private
        procedure OnThreadReceive(Sender: TWThread; var Msg: TThreadMessage);
    public

    end;

var
    Form1: TForm1;

implementation

{$R *.lfm}

uses dateutils;

const
    WM_START    = WM_WTHREAD_BASE + 1;
    WM_ENDED    = WM_WTHREAD_BASE + 2;

type

    { TRunThread }

    TRunThread = class(TWThread)
    public
        procedure WMStart(var Msg: TThreadMessage); message WM_START;
    end;

{ TRunThread }

procedure TRunThread.WMStart(var Msg: TThreadMessage);
var fileName: string;
begin
    // это другой поток
    fileName := FreeString(Msg.LParam);
    // run and wait
    PostMessageFromThread(WM_ENDED, 0, NewString(fileName));
    Terminate;
end;

{ TForm1 }

procedure TForm1.OnThreadReceive(Sender: TWThread; var Msg: TThreadMessage);
var fileName: string;
begin
    case Msg.Message of
        WM_ENDED: begin
            fileName := FreeString(Msg.LParam);
            // пишем в лог время получения
        end;
    end;
end;

procedure TForm1.FormCreate(Sender: TObject);
var w: TRunThread;
begin
    w := TRunThread.Create;
    w.FreeOnTerminate := true;
    w.OnThreadReceiveMessage := OnThreadReceive;    
    w.PostToThreadMessage(WM_START, 0, NewString('SomeFile.exe'));
    // пишем в лог время старта
end;     


Поток запускается, выполняет задачу и сообщив об окончании самоубивается.

П.С. NewString и FreeString обязательны при передаче строк между потоками.
...
Рейтинг: 0 / 0
Запуск программ
    #39490550
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GallemarJaDiGallemar,
Какая версия делфи?
Классика - №7.
сразу же видно :)
Код: pascal
1.
2.
3.
4.
5.
{$R *.dfm}
Function RunAppAndWait(CmdLine, WorkDir: string): boolean;    //????????? ????????? ? ???????? ??????????
Var SI: TStartupInfo;
    PI : TProcessInformation;
Begin
...
Рейтинг: 0 / 0
Запуск программ
    #39490558
Фотография Gallemar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДокGallemarпропущено...

Классика - №7.
сразу же видно :)

Эдик, ты не прав, что это седьмая не видно, видно, что версия до D 2006 :) тут и покруче некрофилы есть.
...
Рейтинг: 0 / 0
Запуск программ
    #39490652
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gallemarчто это седьмая не видно
семерка проще и быстрее всего ставится. Остальные известные некрофилы - это дефекатор (Д7) и чччД (Д2007)

зы. все-все... больше не оффтоплю
...
Рейтинг: 0 / 0
Запуск программ
    #39490673
Фотография Gallemar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДокGallemarчто это седьмая не видно
семерка проще и быстрее всего ставится. Остальные известные некрофилы - это дефекатор (Д7) и чччД (Д2007)

Хвастунов ещё. Сибиряков.
...
Рейтинг: 0 / 0
Запуск программ
    #39490802
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gallemar,

Меня еще запиши - у меня проект на Д6 еще живой :)
...
Рейтинг: 0 / 0
Запуск программ
    #39490817
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да тут и на Д5 попадаются
...
Рейтинг: 0 / 0
Запуск программ
    #39490832
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
у нас есть пучок проектов на Д5, с 1999 года живут.
в своё время руководство поленилось озаботиться переползанием на более свежие версии,
а сейчас перетащить это окаменевшее Г и вовсе нереально (в разумные сроки).
помимо этого есть проекты на Д7 и 2009.
все новые разработки сейчас на Лазаре.
аминь.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Запуск программ
    #39490833
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДокGallemarчто это седьмая не видно
семерка проще и быстрее всего ставится. Остальные известные некрофилы - это дефекатор (Д7) и чччД (Д2007)

зы. все-все... больше не оффтоплю

Я еще на D2006 :)
...
Рейтинг: 0 / 0
Запуск программ
    #39490929
Фотография Gallemar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Заоффтопили :) но я не против. Завтра кину код ,гляньте общим взором.
...
Рейтинг: 0 / 0
Запуск программ
    #39491108
Любезный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторвсе новые разработки сейчас на Лазаре.
Кроссплатформа или чисто под вынь?
...
Рейтинг: 0 / 0
Запуск программ
    #39492468
Mikhalich
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
WaitForSingleObject заменить на WaitForMultipleObjects
...
Рейтинг: 0 / 0
Запуск программ
    #39492822
Фотография Gallemar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls,inifiles, FIBQuery, pFIBQuery, FIBDatabase,
  pFIBDatabase;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    Memo2: TMemo;
    pFIBDatabase1: TpFIBDatabase;
    pFIBTransaction1: TpFIBTransaction;
    pFIBQuery1: TpFIBQuery;
    pFIBTransaction2: TpFIBTransaction;
    pFIBQuery2: TpFIBQuery;
    pFIBTransaction3: TpFIBTransaction;
    pFIBQuery3: TpFIBQuery;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

    TMyThread = class(TThread)
    private
    { Private declarations }
  protected
    procedure Execute; override;
    Function RunAppAndWait(CmdLine, WorkDir: string): boolean;
  end;

var
    Form1: TForm1;
    // TMyThread
    MyThread: TMyThread;
    tpath1, tpath2: string;
implementation

{$R *.dfm}
Function TMyThread.RunAppAndWait(CmdLine, WorkDir: string): boolean;     //Запустить программу и дождатся завершения
Var SI: TStartupInfo;
    PI : TProcessInformation;
Begin
   ZeroMemory(@SI, SizeOf(SI));
   SI.cb := SizeOf(SI);
   Result := CreateProcess(nil, PChar(CmdLine), nil, nil, false, 0, nil, PChar(WorkDir), SI, PI);
   If Result Then Begin
      CloseHandle(PI.hThread);
      WaitForSingleObject(PI.hProcess, INFINITE);
      CloseHandle(PI.hProcess)
   End
End;

procedure TMyThread.Execute;
var
            start_time: tdatetime;
            stop_time: tdatetime;
            tsr : tsearchrec;
            tsr1 : tsearchrec;
begin
                    start_time := now;
                    //проверяем, есть ли файлы в каталогах
                    if FindFirst(tpath1 + '*.xls',faAnyFile,tsr1) = 0 then begin
       //есть, идем дальше
                      FindClose(tsr1);
                      Form1.pFIBQuery2.SQL.Clear;
                      Form1.pFIBQuery2.SQL.Add('insert into IMPORT_LOG (WRITE_TIME,FILE_NAME,FILE_DATE,KIND) values (current_timestamp,:FILE_NAME,:FILE_DATE,:KIND)');
                      Form1.pFIBTransaction2.StartTransaction;
                      //вытаскиваем информацию о заливаемых файлах
                      if FindFirst(tpath1 + '*.xls',faAnyFile,tsr) = 0 then
                        repeat
                            if (tsr.attr and faDirectory) = faDirectory  then Continue;
                            //записываем данные
                                      Form1.pFIBQuery2.ParamByName('FILE_NAME').Value:= tsr.name;
                                      Form1.pFIBQuery2.ParamByName('FILE_DATE').Value:= FileDateToDateTime(tsr.time);
                                      Form1.pFIBQuery2.ParamByName('KIND').Value:= 42;
                                      Form1.pFIBQuery2.ExecQuery();
                        until FindNext(tsr) <> 0;
                    Form1.pFIBTransaction2.Commit;
                    FindClose(tsr);
                    RunAppAndWait(tpath2, 'c:\S-Market\');
                    stop_time := now;
                    Form1.pFIBQuery1.SQL.Clear;
                    Form1.pFIBQuery1.SQL.Add('insert into IMPORT_TIME_LOG (START1,STOP1,KIND) values (:START1,:STOP1,:KIND)');
                    Form1.pFIBTransaction1.StartTransaction;
                    Form1.pFIBQuery1.ParamByName('START1').Value:= start_time;
                    Form1.pFIBQuery1.ParamByName('STOP1').Value:= stop_time;
                    Form1.pFIBQuery1.ParamByName('KIND').Value:= 42;
                    Form1.pFIBQuery1.ExecQuery();
                    Form1.pFIBTransaction1.Commit;
                    end else
                    //файлов нет, фиксируем холостой запуск
                           begin
                                FindClose(tsr1);
                                Form1.pFIBQuery3.SQL.Clear;
                                Form1.pFIBQuery3.SQL.Add('insert into IMPORT_EXISTS_LOG (WRITE_TIME,KIND) values (current_timestamp,:KIND)');
                                Form1.pFIBTransaction3.StartTransaction;
                                Form1.pFIBQuery3.ParamByName('KIND').Value:= 42;
                                Form1.pFIBQuery3.ExecQuery();
                                Form1.pFIBTransaction3.Commit;
                           end;

end;

procedure TForm1.Button1Click(Sender: TObject);
var
    i : integer;
    fini: TIniFile;
    sections: TStringList;
    tpath3: string;
begin
    memo1.Lines.Clear;
    fini:=TIniFile.Create(ExtractFilePath(Application.ExeName)+'init.ini');
    tpath3 := ExtractFilepath(Application.ExeName);
    sections := TStringList.Create;
    fini.ReadSections(sections);
    //проходим по настройкам, получаем пути
for i :=0 to (sections.Count)-1   do
begin
    memo1.Lines.Add(fini.ReadString(sections[i],'source',''));
    memo1.Lines.Add(fini.ReadString(sections[i],'target',''));
    tpath1:=  fini.ReadString(sections[i],'source','');
    tpath2:=  fini.ReadString(sections[i],'target','');
   MyThread:=TMyThread.Create(False);
   MyThread.Priority:=tpNormal;

end;
end;

end.


переписал в таком виде, осталась проблема - неправильно передается tpath2 и одно приложение запускается дважды.
Ini такой:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
[1]
source=c:\Temp\01\
target=c:\S-Market\CalcPart.exe autostart autoclose
[2]
source=c:\Temp\02\
target=c:\S-Market_load\CalcPart.exe autostart autoclose
[3]
source=c:\Temp\03\
target=C:\Windows\SysWOW64\notepad.exe
...
Рейтинг: 0 / 0
Запуск программ
    #39492836
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gallemarнеправильно передается tpath2
Потому что потоки запускаются параллельно основному...

Потому и говорил, используй мое решение, там очередь сообщений реализована.
...
Рейтинг: 0 / 0
Запуск программ
    #39492843
Фотография Gallemar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanПотому что потоки запускаются параллельно основному...

И как быть в таком случае? tpath1 передается без проблем
...
Рейтинг: 0 / 0
Запуск программ
    #39492855
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gallemartpath1 передается без проблем
Как раз с проблемами, т.к. к моменту реального старта 2-го или 3-го потока, там другие значения.

Посмотри на мой код: строка передается потоку (копированием), а не остается в основном потоке.
...
Рейтинг: 0 / 0
Запуск программ
    #39492883
Фотография Gallemar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanПосмотри на мой код: строка передается потоку (копированием), а не остается в основном потоке.
Сделал вот так
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
procedure TMyThread.Execute;
var
            start_time: tdatetime;
            stop_time: tdatetime;
            tsr : tsearchrec;
            tsr1 : tsearchrec;
            path_files, path_exe: string;
begin
FreeOnTerminate := true;
path_files := tpath1;
path_exe := tpath2;
                    start_time := now;
                    //проверяем, есть ли файлы в каталогах
                    if FindFirst(path_files + '*.xls',faAnyFile,tsr1) = 0 then begin
       //есть, идем дальше
                      FindClose(tsr1);
                      //Form1.pFIBDatabase2.Open;
                      Form1.pFIBQuery2.SQL.Clear;
                      Form1.pFIBQuery2.SQL.Add('insert into IMPORT_LOG (WRITE_TIME,FILE_NAME,FILE_DATE,KIND) values (current_timestamp,:FILE_NAME,:FILE_DATE,:KIND)');
                      Form1.pFIBTransaction2.StartTransaction;
                      //вытаскиваем информацию о заливаемых файлах



Вроде работает, но почему то иногда одна программа может не запустится + когда запускаю отладчиком получаю ошибку с одним из запросов,причем то она есть, то её нет https://s8.hostingkartinok.com/uploads/images/2017/07/11ab422a3ddd4b36bbd319a1e9dc20c5.png
...
Рейтинг: 0 / 0
Запуск программ
    #39492895
Фотография Gallemar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как я понимаю в этом блоке проблема:
Код: 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.
FreeOnTerminate := true;
                    path_files := tpath1;
                    path_exe := tpath2;
                    start_time := now;
                    //проверяем, есть ли файлы в каталогах
                    if FindFirst(path_files + '*.xls',faAnyFile,tsr1) = 0 then begin
       //есть, идем дальше
                      FindClose(tsr1);
                      Form1.pFIBQuery2.SQL.Clear;
                      Form1.pFIBQuery2.SQL.Add('insert into IMPORT_LOG (WRITE_TIME,FILE_NAME,FILE_DATE,KIND) values (current_timestamp,:FILE_NAME,:FILE_DATE,:KIND)');
                      Form1.pFIBTransaction2.StartTransaction;
                      //вытаскиваем информацию о заливаемых файлах, файлов может быть много,нужно в базу внести инфо что мы импортировали
                      if FindFirst(path_files + '*.xls',faAnyFile,tsr) = 0 then
                        repeat
                            if (tsr.attr and faDirectory) = faDirectory  then Continue;
                            //записываем данные в запрос 
                                      Form1.pFIBQuery2.ParamByName('FILE_NAME').Value:= tsr.name;
                                      Form1.pFIBQuery2.ParamByName('FILE_DATE').Value:= FileDateToDateTime(tsr.time);
                                      Form1.pFIBQuery2.ParamByName('KIND').Value:= 42;
                                //выполняем его
                                      Form1.pFIBQuery2.ExecQuery();
                        until FindNext(tsr) <> 0;
                    Form1.pFIBTransaction2.Commit;
                    FindClose(tsr);
                    RunAppAndWait(path_exe, 'c:\S-Market\');

...
Рейтинг: 0 / 0
Запуск программ
    #39492923
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем у тебя 2 ошибки:
1. Использование глобальных переменных для параллельно выполняющихся потоков.
2. Как п.1, только теперь относительно еще и компонент фибов.

Как исправить:
1. У каждого потока прикрути свой конструктор, в который и загоняй нужные переменные и нигде кроме потока с ними не работай.
2. В каждом потоке создавай свои запросы, а еще лучше и сами соединения. Грубо говоря, из потока никаких обращений к формам и к тому, что на них лежит быть не должно.
...
Рейтинг: 0 / 0
Запуск программ
    #39492924
Фотография Gallemar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanКак исправить:
1. У каждого потока прикрути свой конструктор, в который и загоняй нужные переменные и нигде кроме потока с ними не работай.
2. В каждом потоке создавай свои запросы, а еще лучше и сами соединения. Грубо говоря, из потока никаких обращений к формам и к тому, что на них лежит быть не должно.

1. Можешь примером кинуть?
2. Это как? Отдельный контейнер для фибов? Или как?
...
Рейтинг: 0 / 0
Запуск программ
    #39492928
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gallemar1. Можешь примером кинуть?
Пример выше был. А если по последнему, чтоб прямо свой-свой поток, то просто пропертей наделай своему потоку и заполняй их конструктором потока (TMyThread.Create(const SomeVar1, SomeVar2)
Gallemar2. Это как? Отдельный контейнер для фибов? Или как?
Это в каждом execute создаешь ручками fibdatabase, fibтранзакцию и fibзапрос и там же с ними прощаешься.
...
Рейтинг: 0 / 0
Запуск программ
    #39493166
Фотография Gallemar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman,
по п.2 переписал в таком виде:
Код: 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.
58.
59.
60.
61.
62.
63.
procedure TMyThread.Execute;
      var
            start_time: tdatetime;
            stop_time: tdatetime;
            tsr : tsearchrec;
            tsr1 : tsearchrec;
            path_files, path_exe: string;
            path_kind : integer;
            db :   TpFIBDatabase;
            trans : TpFIBTransaction;
            query:   TpFIBQuery;
begin
            db:=TpFIBDatabase.Create(nil);
             trans:= TpFIBTransaction.Create(nil);
            query:= TpFIBQuery.Create(nil);
            db.connectparams.Username:='SYSDBA';
            db.connectparams.Password:='masterkey';
            db.DatabaseName:='d:\FDBase\FB_LOG_DATABASE.FDB';
            db.DefaultUpdateTransaction:=trans;
            db.LibraryName:= 'fbclient.dll';
            trans.DefaultDatabase:=db;
            query.Database:=db;
            query.Transaction:=trans;
            db.connected:=True;
                    FreeOnTerminate := true;
                    path_files := tpath1;
                    path_exe := tpath2;
                    path_kind := strtoint(tkind);
                    start_time := now;
                    //проверяем, есть ли файлы в каталогах
                    if FindFirst(path_files + '*.xls',faAnyFile,tsr1) = 0 then begin
       //есть, идем дальше
                      FindClose(tsr1);
                      query.SQL.Clear;
                      query.SQL.Add('insert into IMPORT_LOG (WRITE_TIME,FILE_NAME,FILE_DATE,KIND) values (current_timestamp,:FILE_NAME,:FILE_DATE,:KIND)');
                      trans.StartTransaction;
                      //вытаскиваем информацию о заливаемых файлах
                      if FindFirst(path_files + '*.xls',faAnyFile,tsr) = 0 then
                        repeat
                            if (tsr.attr and faDirectory) = faDirectory  then Continue;
                            //записываем данные
                                      query.ParamByName('FILE_NAME').Value:= tsr.name;
                                      query.ParamByName('FILE_DATE').Value:= FileDateToDateTime(tsr.time);
                                      query.ParamByName('KIND').Value:= path_kind;
                                      query.ExecQuery();
                        until FindNext(tsr) <> 0;
                    trans.Commit;
                    db.Free;
                    trans.Free;
                    query.Free;
                    FindClose(tsr);
                    RunAppAndWait(path_exe, 'c:\S-Market\');

                    stop_time := now;
                  { ...    }
                    end else
                    //файлов нет, фиксируем холостой запуск
                           begin
                                FindClose(tsr1);
                             {  ...    }
                           end;

end;


Пока сделал для одного запроса, не могу понять почему он не выполняется. В мониторинге коннекты вижу.
...
Рейтинг: 0 / 0
Запуск программ
    #39493182
Фотография Gallemar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вроде разобрался
Код: 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.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls,inifiles, FIBQuery, pFIBQuery,FIBDatabase,  pFIBDatabase ;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    Memo2: TMemo;

    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

    TMyThread = class(TThread)
    private
    { Private declarations }
  protected
    procedure Execute; override;
    Function RunAppAndWait(CmdLine, WorkDir: string): boolean;
  end;

var
    Form1: TForm1;
    // TMyThread
    MyThread: TMyThread;
    tpath1, tpath2: string;
    tkind: string;

implementation

{$R *.dfm}
Function TMyThread.RunAppAndWait(CmdLine, WorkDir: string): boolean;     //Запустить программу и дождатся завершения
Var SI: TStartupInfo;
    PI : TProcessInformation;
Begin
   ZeroMemory(@SI, SizeOf(SI));
   SI.cb := SizeOf(SI);
   Result := CreateProcess(nil, PChar(CmdLine), nil, nil, false, 0, nil, PChar(WorkDir), SI, PI);
   If Result Then Begin
      CloseHandle(PI.hThread);
      WaitForSingleObject(PI.hProcess, INFINITE);
      CloseHandle(PI.hProcess)
   End
End;

procedure TMyThread.Execute;
      var
            start_time: tdatetime;
            stop_time: tdatetime;
            tsr : tsearchrec;
            tsr1 : tsearchrec;
            path_files, path_exe: string;
            path_kind : integer;
            db1,db2,db3 :   TpFIBDatabase;
            trans1,trans2,trans3 : TpFIBTransaction;
            query1,query2,query3:   TpFIBQuery;
begin
            db1:=TpFIBDatabase.Create(nil);
            trans1:= TpFIBTransaction.Create(nil);
            query1:= TpFIBQuery.Create(nil);
            db1.connectparams.Username:='SYSDBA';
            db1.connectparams.Password:='masterkey';
            db1.DatabaseName:='d:\FDBase\FB_LOG_DATABASE.FDB';
            db1.DefaultUpdateTransaction:=trans1;
            db1.LibraryName:= 'fbclient.dll';
            trans1.DefaultDatabase:=db1;
            query1.Database:=db1;
            query1.Transaction:=trans1;
            db1.connected:=True;
                    FreeOnTerminate := true;
                    path_files := tpath1;
                    path_exe := tpath2;
                    path_kind := strtoint(tkind);
                    start_time := now;
                    //проверяем, есть ли файлы в каталогах
                    if FindFirst(path_files + '*.xls',faAnyFile,tsr1) = 0 then begin
       //есть, идем дальше
                      FindClose(tsr1);
                      query1.SQL.Clear;
                      query1.SQL.Add('insert into IMPORT_LOG (WRITE_TIME,FILE_NAME,FILE_DATE,KIND) values (current_timestamp,:FILE_NAME,:FILE_DATE,:KIND)');
                      trans1.StartTransaction;
                      //вытаскиваем информацию о заливаемых файлах
                      if FindFirst(path_files + '*.xls',faAnyFile,tsr) = 0 then
                        repeat
                            if (tsr.attr and faDirectory) = faDirectory  then Continue;
                            //записываем данные
                                      query1.ParamByName('FILE_NAME').Value:= tsr.name;
                                      query1.ParamByName('FILE_DATE').Value:= FileDateToDateTime(tsr.time);
                                      query1.ParamByName('KIND').Value:= path_kind;
                                      query1.ExecQuery();
                        until FindNext(tsr) <> 0;
                    trans1.Commit;

                    FindClose(tsr);
                    RunAppAndWait(path_exe, 'c:\S-Market\');
                    db1.Free;
                    trans1.Free;
                    query1.Free;
                    stop_time := now;
                    db2:=TpFIBDatabase.Create(nil);
                    trans2:= TpFIBTransaction.Create(nil);
                    query2:= TpFIBQuery.Create(nil);
                    db2.connectparams.Username:='SYSDBA';
                    db2.connectparams.Password:='masterkey';
                    db2.DatabaseName:='d:\FDBase\FB_LOG_DATABASE.FDB';
                    db2.DefaultUpdateTransaction:=trans2;
                   db2.LibraryName:= 'fbclient.dll';
                    trans2.DefaultDatabase:=db2;
                    query2.Database:=db2;
                    query2.Transaction:=trans2;
                    db2.connected:=True;
                    query2.SQL.Clear;
                    query2.SQL.Add('insert into IMPORT_TIME_LOG (START1,STOP1,KIND) values (:START1,:STOP1,:KIND)');
                    trans2.StartTransaction;
                    query2.ParamByName('START1').Value:= start_time;
                    query2.ParamByName('STOP1').Value:= stop_time;
                    query2.ParamByName('KIND').Value:= path_kind;
                    query2.ExecQuery();
                    trans2.Commit;
                    db2.Free;
                    trans2.Free;
                    query2.Free;
                    end else
                    //файлов нет, фиксируем холостой запуск
                           begin
                           db3:=TpFIBDatabase.Create(nil);
                            trans3:= TpFIBTransaction.Create(nil);
                            query3:= TpFIBQuery.Create(nil);
                            db3.connectparams.Username:='SYSDBA';
                            db3.connectparams.Password:='masterkey';
                            db3.DatabaseName:='d:\FDBase\FB_LOG_DATABASE.FDB';
                            db3.DefaultUpdateTransaction:=trans3;
                            db3.LibraryName:= 'fbclient.dll';
                            trans3.DefaultDatabase:=db3;
                            query3.Database:=db3;
                            query3.Transaction:=trans3;
                            db3.connected:=True;
                                FindClose(tsr1);
                                query3.SQL.Clear;
                                query3.SQL.Add('insert into IMPORT_EXISTS_LOG (WRITE_TIME,KIND) values (current_timestamp,:KIND)');
                                trans3.StartTransaction;
                                query3.ParamByName('KIND').Value:= path_kind;
                                query3.ExecQuery();
                                trans3.Commit;
                                db3.Free;
                                trans3.Free;
                                query3.Free;
                           end;

end;

procedure TForm1.Button1Click(Sender: TObject);
var
    i : integer;
    fini: TIniFile;
    sections: TStringList;
    tpath3: string;
  //  tpath1, tpath2: string;
begin
    memo1.Lines.Clear;
    fini:=TIniFile.Create(ExtractFilePath(Application.ExeName)+'init.ini');
    tpath3 := ExtractFilepath(Application.ExeName);
    sections := TStringList.Create;
    fini.ReadSections(sections);
    //проходим по настройкам, получаем пути
for i :=0 to (sections.Count)-1   do
begin
    memo1.Lines.Add(fini.ReadString(sections[i],'source',''));
    memo1.Lines.Add(fini.ReadString(sections[i],'target',''));
    memo1.Lines.Add(fini.ReadString(sections[i],'kind',''));
    tpath1:=  fini.ReadString(sections[i],'source','');
    tpath2:=  fini.ReadString(sections[i],'target','');
    tkind:=  fini.ReadString(sections[i],'kind','');
   MyThread:=TMyThread.Create(False);
   MyThread.Priority:=tpNormal;

end;
end;

end.

...
Рейтинг: 0 / 0
Запуск программ
    #39493217
Фотография Gallemar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman пропертей наделай своему потоку и заполняй их конструктором потока (TMyThread.Create(const SomeVar1, SomeVar2)

Вместо глобальных переменных использовать свойства?
...
Рейтинг: 0 / 0
Запуск программ
    #39493248
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gallemarwadman пропертей наделай своему потоку и заполняй их конструктором потока (TMyThread.Create(const SomeVar1, SomeVar2)

Вместо глобальных переменных использовать свойства?
Верно. С ними будет работать только сам поток и они не будут переплетаться со свойствами других потоков.
...
Рейтинг: 0 / 0
Запуск программ
    #39493251
Фотография Gallemar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman, всю ночь ждал когда напишешь :) У меня небольшое чп с базой произошло, посплю и буду смотреть. Док ещё подсказку скинул.
...
Рейтинг: 0 / 0
Запуск программ
    #39493399
Фотография Gallemar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сделал вот в таком виде:
Код: 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.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls,inifiles, FIBQuery, pFIBQuery,FIBDatabase,  pFIBDatabase ;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    Memo2: TMemo;

    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

    TMyThread = class(TThread)
    private
    { Private declarations }
    s : string;
  protected
    procedure Execute; override;
    Function RunAppAndWait(CmdLine, WorkDir: string): boolean;
    public
    constructor Create(CreateSuspended: Boolean);
  end;

var
    Form1: TForm1;
    // TMyThread
    //MyThread: TMyThread;
    tpath1, tpath2: string;
    tkind: string;

implementation

{$R *.dfm}
Function TMyThread.RunAppAndWait(CmdLine, WorkDir: string): boolean;     //&#199;&#224;&#239;&#243;&#241;&#242;&#232;&#242;&#252; &#239;&#240;&#238;&#227;&#240;&#224;&#236;&#236;&#243; &#232; &#228;&#238;&#230;&#228;&#224;&#242;&#241;&#255; &#231;&#224;&#226;&#229;&#240;&#248;&#229;&#237;&#232;&#255;
Var SI: TStartupInfo;
    PI : TProcessInformation;
Begin
   ZeroMemory(@SI, SizeOf(SI));
   SI.cb := SizeOf(SI);
   Result := CreateProcess(nil, PChar(CmdLine), nil, nil, false, 0, nil, PChar(WorkDir), SI, PI);
   If Result Then Begin
      CloseHandle(PI.hThread);
      WaitForSingleObject(PI.hProcess, INFINITE);
      CloseHandle(PI.hProcess)
   End
End;

   constructor TMyThread.Create(CreateSuspended: Boolean);
begin
  Priority:= tpLower;
  FreeOnTerminate:= False;
  inherited Create(CreateSuspended);
end;

procedure TMyThread.Execute;
      var
            tsr : tsearchrec;
            tsr1 : tsearchrec;
            path_files, path_exe: string;

begin
       {   ...  }
                    FreeOnTerminate := true;
                    path_files := tpath1;
                    path_exe := tpath2;
                 
                    if FindFirst(path_files + '*.xls',faAnyFile,tsr1) = 0 then begin
   
                      FindClose(tsr1);
                    {  ...   }
       
                      if FindFirst(path_files + '*.xls',faAnyFile,tsr) = 0 then
                        repeat
                            if (tsr.attr and faDirectory) = faDirectory  then Continue;
                                     { ..}
                        until FindNext(tsr) <> 0;
                   { .. }

                    FindClose(tsr);
                    RunAppAndWait(path_exe, 'c:\S-Market\');
                  {  ...  }
                    end else
                           begin
                         {  ...  }
                           end;

end;

procedure TForm1.Button1Click(Sender: TObject);
var
    i : integer;
    fini: TIniFile;
    sections: TStringList;
    tpath3: string;
  //  tpath1, tpath2: string;
  MyThread: TMyThread;
begin
    memo1.Lines.Clear;
    fini:=TIniFile.Create(ExtractFilePath(Application.ExeName)+'init.ini');
    tpath3 := ExtractFilepath(Application.ExeName);
    sections := TStringList.Create;
    fini.ReadSections(sections);
for i :=0 to (sections.Count)-1   do
begin
    memo1.Lines.Add(fini.ReadString(sections[i],'source',''));
    memo1.Lines.Add(fini.ReadString(sections[i],'target',''));
    memo1.Lines.Add(fini.ReadString(sections[i],'kind',''));
    tpath1:=  fini.ReadString(sections[i],'source','');
    tpath2:=  fini.ReadString(sections[i],'target','');
    tkind:=  fini.ReadString(sections[i],'kind','');
   MyThread:=TMyThread.Create(False);
   MyThread.Priority:=tpNormal;
   MyThread.s := tpath2;

end;
end;

end.



Компилируется, но получаю ошибку неверного дескриптора. Подскажите, где ошибка?
...
Рейтинг: 0 / 0
Запуск программ
    #39493707
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gallemar,

Выложи тестовый проект в архиве и версию дельфей, на которой пришешь
...
Рейтинг: 0 / 0
Запуск программ
    #39493747
Фотография Gallemar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
https://yadi.sk/d/hBqisfHr3LL6EQ
это на семерке. Запросы я все закомментировал, чтобы не мешали, только в uses прописаны фибы.
...
Рейтинг: 0 / 0
Запуск программ
    #39493780
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gallemar,

попробуй так
Код: 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.
    TMyThread = class(TThread)
    private
    { Private declarations }
    Fpath1, Fpath2,Fkind: string;
  protected
    procedure Execute; override;
    Function RunAppAndWait(CmdLine, WorkDir: string): boolean;
    public
    constructor Create(CreateSuspended: Boolean; var Apath1, Apath2, Akind : string);
  end;
...
var
    Form1: TForm1;
    // TMyThread
    //MyThread: TMyThread;
//    tpath1, tpath2: string;
//    tkind: string;
...
   constructor TMyThread.Create(CreateSuspended: Boolean; var Apath1, Apath2, Akind : string);
begin
  Priority:= tpLower;
  Fpath1:= Apath1;
  Fpath2:= Apath2;
  Fkind:=Akind;
//  FreeOnTerminate:= False;

  inherited Create(CreateSuspended);
end;

procedure TMyThread.Execute;
      var
           // start_time: tdatetime;
            //stop_time: tdatetime;
            tsr : tsearchrec;
            tsr1 : tsearchrec;
//            path_files, path_exe: string;//меняешь в коде на Fpath1, Fpath2 или используешь напрямую
...
           db1.connected:=True;
//                    FreeOnTerminate := true;

...
procedure TForm1.Button1Click(Sender: TObject);
...
for i :=0 to (sections.Count)-1   do
begin
MyThread:=TMyThread.Create(True, 'сюда свои пути к чему-то там');
memo1.Lines.Add(fini.ReadString(sections[i],'source',''));
...
MyThread.Resume;
end


основной посыл:
- все строки можно передавать в параметрах
- FreeOnTerminate определяется либо в момент создания, либо в конструкторе
- FreeOnTerminate = False, если только собираешься уничтожать поток после завершения сам
...
Рейтинг: 0 / 0
Запуск программ
    #39493790
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, FreeOnTerminate:= True все-таки пропиши где-нибудь (лучше в конструкторе) :)
...
Рейтинг: 0 / 0
Запуск программ
    #39493801
Фотография Gallemar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДокGallemar,
попробуй так

procedure TForm1.Button1Click(Sender: TObject);
...
for i :=0 to (sections.Count)-1 do
begin
==>MyThread:=TMyThread.Create(True, >>>'сюда свои пути к чему-то там'<<<);
memo1.Lines.Add(fini.ReadString(sections,'source',''));
...
==>MyThread.Resume;
end

[/src]


Попробовал, затык на процедуре:
Код: 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.
procedure TForm1.Button1Click(Sender: TObject);
var
    i : integer;
    fini: TIniFile;
    sections: TStringList;
    tpath1,tpath2,tpath3: string;
  //  tpath1, tpath2: string;
  MyThread: TMyThread;
  tkind: string;
begin
    memo1.Lines.Clear;
    fini:=TIniFile.Create(ExtractFilePath(Application.ExeName)+'init.ini');
    tpath3 := ExtractFilepath(Application.ExeName);
    sections := TStringList.Create;
    fini.ReadSections(sections);
    //проходим по настройкам, получаем пути
for i :=0 to (sections.Count)-1   do
begin
    memo1.Lines.Add(fini.ReadString(sections[i],'source',''));
    memo1.Lines.Add(fini.ReadString(sections[i],'target',''));
    memo1.Lines.Add(fini.ReadString(sections[i],'kind',''));
    tpath1:=  fini.ReadString(sections[i],'source','');
    tpath2:=  fini.ReadString(sections[i],'target','');
    tkind:=  fini.ReadString(sections[i],'kind','');
[i]   MyThread:=TMyThread.Create(True,tpath2);
   MyThread.Priority:=tpNormal;
   MyThread.Resume;

end;



Not enough actual parameters
...
Рейтинг: 0 / 0
Запуск программ
    #39493803
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GallemarNot enough actual parameters
т.е. у тебя в объявлении процедуры параметров больше, чем ты пытаешься объявить при вызове. Игорь, посмотри код внимательнее и включи мозг - это элементарные ошибки :)
...
Рейтинг: 0 / 0
Запуск программ
    #39493811
Фотография Gallemar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док,исправил. Всё равно ошибка Thread Error: Неверный дескриптор (6)
...
Рейтинг: 0 / 0
Запуск программ
    #39493824
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gallemar,

давай код или лучше прикрепи архив с проектом :)
...
Рейтинг: 0 / 0
Запуск программ
    #39493826
Фотография Gallemar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Запуск программ
    #39494028
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gallemar,

пробуй
Код: 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.
constructor TMyThread.Create(CreateSuspended: Boolean; var Apath1, Apath2, Akind : string);
begin
  inherited Create(CreateSuspended);
  Priority:= tpLower;
  FreeOnTerminate:= True;
  Fpath1:= Apath1;
  Fpath2:= Apath2;
  Fkind:= Akind;
  if CreateSuspended then Resume;
end;
//=======================
procedure TForm1.Button1Click(Sender: TObject);
var
    i: integer;
    fini: TIniFile;
    sections: TStringList;
    tpath1
    ,tpath2
    ,tpath3
    , tkind: string;
    MyThread: TMyThread;
begin
    memo1.Lines.Clear;
    sections := TStringList.Create;
    try
      fini:=TIniFile.Create(ExtractFilePath(Application.ExeName)+'init.ini');
      tpath3 := ExtractFilepath(Application.ExeName);
      fini.ReadSections(sections);
      //&#239;&#240;&#238;&#245;&#238;&#228;&#232;&#236; &#239;&#238; &#237;&#224;&#241;&#242;&#240;&#238;&#233;&#234;&#224;&#236;, &#239;&#238;&#235;&#243;&#247;&#224;&#229;&#236; &#239;&#243;&#242;&#232;
      for i:= 0 to pred(sections.Count) do
      begin
        tpath1:=  fini.ReadString(sections[i],'source','');
        tpath2:=  fini.ReadString(sections[i],'target','');
        tkind:=  fini.ReadString(sections[i],'kind','');

        memo1.Lines.Add(tpath1);
        memo1.Lines.Add(tpath2);
        memo1.Lines.Add(tkind);

        MyThread:= TMyThread.Create(True,tpath2,tpath1,tkind);
      end;
    finally
      FreeAndNil(sections);
    end;
end;


зы. Игорь, ты код в блокноте пишешь что ли?
...
Рейтинг: 0 / 0
Запуск программ
    #39494029
Фотография Gallemar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДокGallemar,

пробуй
Код: 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.
constructor TMyThread.Create(CreateSuspended: Boolean; var Apath1, Apath2, Akind : string);
begin
  inherited Create(CreateSuspended);
  Priority:= tpLower;
  FreeOnTerminate:= True;
  Fpath1:= Apath1;
  Fpath2:= Apath2;
  Fkind:= Akind;
  if CreateSuspended then Resume;
end;
//=======================
procedure TForm1.Button1Click(Sender: TObject);
var
    i: integer;
    fini: TIniFile;
    sections: TStringList;
    tpath1
    ,tpath2
    ,tpath3
    , tkind: string;
    MyThread: TMyThread;
begin
    memo1.Lines.Clear;
    sections := TStringList.Create;
    try
      fini:=TIniFile.Create(ExtractFilePath(Application.ExeName)+'init.ini');
      tpath3 := ExtractFilepath(Application.ExeName);
      fini.ReadSections(sections);
      //&#239;&#240;&#238;&#245;&#238;&#228;&#232;&#236; &#239;&#238; &#237;&#224;&#241;&#242;&#240;&#238;&#233;&#234;&#224;&#236;, &#239;&#238;&#235;&#243;&#247;&#224;&#229;&#236; &#239;&#243;&#242;&#232;
      for i:= 0 to pred(sections.Count) do
      begin
        tpath1:=  fini.ReadString(sections[i],'source','');
        tpath2:=  fini.ReadString(sections[i],'target','');
        tkind:=  fini.ReadString(sections[i],'kind','');

        memo1.Lines.Add(tpath1);
        memo1.Lines.Add(tpath2);
        memo1.Lines.Add(tkind);

        MyThread:= TMyThread.Create(True,tpath2,tpath1,tkind);
      end;
    finally
      FreeAndNil(sections);
    end;
end;


зы. Игорь, ты код в блокноте пишешь что ли?

Нет,просто взял для теста
...
Рейтинг: 0 / 0
Запуск программ
    #39494330
Фотография Gallemar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Эдик, спасибо, всё работает. Тут только
Код: plaintext
MyThread:= TMyThread.Create(True,tpath2,tpath1,tkind); 
порядок параметров перепутан был.
...
Рейтинг: 0 / 0
Запуск программ
    #39494376
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gallemar,

Игорь, пиши лучше на Лазаре. Из плюсов: встроенная подсветка кода, встроенный механизм публикации проекта. Д7, конечно, классика, но ...

зы. об твой код ноги ломать можно
...
Рейтинг: 0 / 0
Запуск программ
    #39494381
Фотография Gallemar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДокGallemar,
Игорь, пиши лучше на Лазаре. Из плюсов: встроенная подсветка кода, встроенный механизм публикации проекта. Д7, конечно, классика, но ...
Привык к семерке, Лазарь пока щупаю, для работы на нем не пишу.
Докзы. об твой код ноги ломать можно

Это как?
Форматирование ужасное или сам код?
...
Рейтинг: 0 / 0
Запуск программ
    #39494391
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДокИз плюсов: встроенная подсветка кода, встроенный механизм публикации проекта.
Из минусов - размер release кода больше чем в Токио :(
...
Рейтинг: 0 / 0
Запуск программ
    #39494392
Фотография Gallemar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvpДокИз плюсов: встроенная подсветка кода, встроенный механизм публикации проекта.
Из минусов - размер release кода больше чем в Токио :(
Это такая мелочь
...
Рейтинг: 0 / 0
Запуск программ
    #39494400
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvpИз минусов - размер release кода больше чем в Токио :(
Дефолт с одной формочкой:
Код: plaintext
1.
Delphi 10.2 - 2 221 568 bytes
Lazarus 1.9 - 1 966 592 bytes
...
Рейтинг: 0 / 0
Запуск программ
    #39494407
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev AlexeyalekcvpИз минусов - размер release кода больше чем в Токио :(
Дефолт с одной формочкой:
Код: plaintext
1.
Delphi 10.2 - 2 221 568 bytes
Lazarus 1.9 - 1 966 592 bytes

Видимо что-то поправили, когда я смотрел (честно - давно), у меня меньше 2х с чем-то никак не получалось.
Но всё равно, 2 мегабайта за проект, который ничего не умеет делать - это печальная тенденция.
Видимо поэтому всякие Inno Setup и Total Commanderы до последнего собирались на Delphi 2.0 :)
...
Рейтинг: 0 / 0
Запуск программ
    #39494461
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvpНо всё равно, 2 мегабайта за проект, который ничего не умеет делать - это печальная тенденция.
Это ещё что... Под ведроид ничего не делающая дельфийская прилага вообще 20 метров весит Лазаревая сильно меньше, раз, этак, в десять.
...
Рейтинг: 0 / 0
Запуск программ
    #39494506
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GallemarЭто как?
Форматирование ужасное или сам код?
И то, и другое. И если форматирование кода - вещь довольно таки субъективное(я пока "под себя" его не отформатировал, вообще ничего в твоем коде не понял :) ), то критические вещи,типа, try...finally ты из раза в раз упорно игнорируешь :)

Прислушайся к совету, семерка у тебя, наверняка, пиратка...

alekcvpВидимо что-то поправили
Там много чего за последние 2 года поправили. Помнится, когда Ишенин периодически публиковал тут новости об очередном релизе Лазаря, я был в числе самых ярых противников. Ситуация сменилась где-то после транк 1.5
...
Рейтинг: 0 / 0
Запуск программ
    #39494507
Фотография Gallemar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Докя пока "под себя" его не отформатировал, вообще ничего в твоем коде не понял :)
Есть такая партия, с форматированием проблемы, пока не научился правильно это делать. Иногда просто копирую текст в Notepad++ и там по блокам пытаюсь ошибки в логике найти.

Док критические вещи,типа, try...finally ты из раза в раз упорно игнорируешь :)
Есть такое, а потом эксепшены ловлю

ДокПрислушайся к совету, семерка у тебя, наверняка, пиратка...

У меня есть Tokyo, но к семерке привык как к родной. На Lazarus не хватает фибов, хотя есть IBX от Юры Копнина, правда только под Linux, есть IBX Реактора, обратно ж под винду. Вопрос поднимал о покупке Delphi, если не одобрят - перепишу всё на Lazarus.
...
Рейтинг: 0 / 0
Запуск программ
    #39494528
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gallemarесть IBX от Юры Копнина, правда только под Linux, есть IBX Реактора
Чем они отличаются от оригинала? Аж еще специфические под ОС...
...
Рейтинг: 0 / 0
Запуск программ
    #39494532
Фотография Gallemar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman, две транзакции - пишущая и читающая,как в фибах.
...
Рейтинг: 0 / 0
Запуск программ
    #39494536
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gallemarесть IBX от Юры Копнина, правда только под Linux
Кто тебе это сказал?
они ставятся и компилятся под кроссплатформу, там практически полная копия фибов.









Есть не считать всякие приблуды типа хандлера и проч. несущественную лабудень. Зато там нет "неестественного интеллекта" (© МП), присущего ФИБам, из-за которого при первом коннекте запросы существенно тормозят и (наверное) излишне нагружают сервак.
...
Рейтинг: 0 / 0
Запуск программ
    #39494539
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gallemarдве транзакции - пишущая и читающая,как в фибах.
вы хотели песню?
их есть у меня :)
...
Рейтинг: 0 / 0
Запуск программ
    #39494648
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gallemarwadman, две транзакции - пишущая и читающая,как в фибах.
Если так нужны привычные ibx, то [nick].ru/files/ibx.zip
Я там подправил по мелочи и добавил IBUpdateSQLW, который работает как обычный IBUpdateSQL, но на двух транзакциях.
Кроссплатформ, конечно.
...
Рейтинг: 0 / 0
Запуск программ
    #39494690
Фотография Gallemar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДокGallemarесть IBX от Юры Копнина, правда только под Linux
Кто тебе это сказал?
они ставятся и компилятся под кроссплатформу, там практически полная копия фибов.

Вру. Не под Linux, а под Lazarus
...
Рейтинг: 0 / 0
Запуск программ
    #39494696
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanЯ там подправил по мелочи
Код: pascal
1.
IBLookupComboEditBox.pas(326,27) Error: Identifier not found "UTF8Length"


забыл дописать LazUTF8

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Невозможно найти класс компонента "TIBTransaction".
Он не зарегистрирован посредством RegisterClass, а соответствующий файл LFM отсутствует.
Требуется для модуля:
d:\Archive\development\laz_snapshot\config_\ibx\design\ibsqleditor.pas
===============
Невозможно найти класс компонента "TIBTransaction".
Он не зарегистрирован посредством RegisterClass, а соответствующий файл LFM отсутствует.
Требуется для модуля:
d:\Archive\development\laz_snapshot\config_\ibx\design\ibsqleditor.pas
================
ibsqleditor.pas(158,30) Error: Identifier not found "lpGtk2"


Ы?

ps. последний транк (r55421)
pps. лучше попили это , -Rik- и я будем тебе признательны :)
...
Рейтинг: 0 / 0
Запуск программ
    #39494700
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GallemarВру. Не под Linux, а под Lazarus
так я тебе скрины из какой среды показал? :) Это ibx, допиленные до функционала ФИбов. С твоих слов, то, из-за недостатка чего ты не можешь мигрировать на Лазарь.
...
Рейтинг: 0 / 0
61 сообщений из 61, показаны все 3 страниц
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Запуск программ
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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