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

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

Обработка в потоках [D6]


Страницы:   1 2 3

Term ©   (2005-12-13 12:08:00) 

Работаю с БД из двух TThread, они между собой не пересекаются, т.е используют каждый только свои компоненты.

Так как они не пересекаются то я их и не синхронизировал. Но при работе наблюдаются глюки, то строчки в БД не пропишутся(при append'е), то TGauge начинает глючить (отрисовывается неправильно) и т.д.

Что можете посоветовать


Term   (2005-12-13 13:27:00) [21]

одним постом не поместилось


Term   (2005-12-13 13:27:00) [22]

еще половинка

procedure TDataModule1.HOAfterScroll(DataSet: TDataSet);
begin
if DataModule1.OT.Active then DataModule1.OT.Filtered:=true;
end;

procedure TDataModule1.DSFilterRecord(DataSet: TDataSet;
 var Accept: Boolean);
begin
if (DataSet.FieldByName('NUMDC0').Value=DataModule1.OT.FieldByName('NUMDC0').Value)and
  (DataSet.FieldByName('SUPPC4').Value=DataModule1.OT.FieldByName('SUPPC4').Value)and
  (DataSet.FieldByName('STRBA28').AsString=DataModule1.OT.FieldByName('STRBA14').AsString)and

  (DataSet.FieldByName('COMPC8').Value=DataModule1.OT.FieldByName('COMPC8').Value)and
  (DataSet.FieldByName('COMPN10').Value=DataModule1.OT.FieldByName('COMPN10').Value)and
  (DataSet.FieldByName('MODNU12').Value=DataModule1.OT.FieldByName('MODNU12').Value)and
  (DataSet.FieldByName('UNIPR16').Value=DataModule1.OT.FieldByName('UNIPR511').Value)and
  (DataSet.FieldByName('NUMST14').Value=DataModule1.OT.FieldByName('NUMST55').Value)and

  (DataSet.FieldByName('PRICE176').Value=DataModule1.OT.FieldByName('PRICE86').Value) and
  (DataSet.FieldByName('NUMPA20').Value=DataModule1.OT.FieldByName('NUMPA106').Value) and
  (DataSet.FieldByName('NUMPA24').Value=DataModule1.OT.FieldByName('NUMPA110').Value) and

  (DataSet.FieldByName('QNT172').Value=DataModule1.OT.FieldByName('QNT45').Value)then
       Accept:=true else Accept:=false;
end;

procedure TDataModule1.OTAfterScroll(DataSet: TDataSet);
begin
if DataModule1.DS.Active then DataModule1.DS.Filtered:=true;
end;

procedure TDataModule1.HOFilterRecord(DataSet: TDataSet;
 var Accept: Boolean);
begin
//if DataSet.FieldByName('NUMSK17').AsInteger=0 then Accept:=false
//        else Accept:=true;
end;

procedure TDataModule1.LOGFilterRecord(DataSet: TDataSet;
 var Accept: Boolean);
begin
//if DataSet.FieldByName('DATA').AsDateTime=Log_Form.DateEdit1.Date then
//        Accept:=true else Accept:=false;
end;

procedure TDataModule1.HIFilterRecord(DataSet: TDataSet;
 var Accept: Boolean);
begin
//if DataSet.FieldByName('NUMSK10').AsInteger=0 then Accept:=true
//        else Accept:=false;
end;

end.


Digitman   (2005-12-13 13:26:00) [23]

1. метод Start убрать из public в private или protected
2. убрать обращения к таймерам, да и сами таймеры - они здесь ни к чему
3. где происходит открытие НД Prihod_Zaliv.P_Zagolovki и Zaliv_Rashod.Zagolovki ?


Term   (2005-12-13 13:26:00) [24]

вот TDataModule, второй такойже только под номером 2
unit Unit3;

interface

uses
 SysUtils, Classes, DB, Halcn6db, Dialogs, ADODB, DBTables;

type
 TDataModule1 = class(TDataModule)
   COMPBS: THalcyonDataSet;
   FIRMBS: THalcyonDataSet;
   CNTRBS: THalcyonDataSet;
   WRMODREF: THalcyonDataSet;
   Str_In: THalcyonDataSet;
   HI: THalcyonDataSet;
   NastrBase: THalcyonDataSet;
   ADOConnection1: TADOConnection;
   Pereliv: TADOQuery;
   WSKLADBS: THalcyonDataSet;
   Pereliv1: TADOQuery;
   Spr_Aptek: TADOQuery;
   Spr_Medcine: TADOQuery;
   RFCL2005: THalcyonDataSet;
   RFDR2005: THalcyonDataSet;
   PKINDBS: THalcyonDataSet;
   WRMKCREF: THalcyonDataSet;
   Personal: TADOQuery;
   Spr_Vid_Oplata: TADOQuery;
   CDOP2BS: THalcyonDataSet;
   Spr_Code_OperRashod: TADOQuery;
   Spr_MagnCard: TADOQuery;
   DataSource1: TDataSource;
   DataSource2: TDataSource;
   LOG: THalcyonDataSet;
   Sravn_PrihBUF: TADOQuery;
   Sravn_Rash: TADOQuery;
   DataSource3: TDataSource;
   Sravn_PrihDetalBUF: TADOQuery;
   Prihod_MasterLOG: TADOQuery;
   Update_Prihod: TADOQuery;
   Update_Prihod_Detal: TADOQuery;
   DataSource4: TDataSource;
   Sravn_RashDetalBUF: TADOQuery;
   Rashod_MasterLOG: TADOQuery;
   Update_Rashod: TADOQuery;
   Update_Rashod_Detal: TADOQuery;
   CDOP1BS: THalcyonDataSet;
   Spr_Code_OperPrihod: TADOQuery;
   Prihod_MasterLOG1: TADOQuery;
   OTCH_Prihod: TADOQuery;
   OTCH_Rashod: TADOQuery;
   Rashod_MasterLOG1: TADOQuery;
   Pereliv2: TADOQuery;
   Typ_Id: TADOQuery;
   DataSource5: TDataSource;
   HO: TTable;
   OT: TTable;
   DS: TTable;
   HO1: TTable;
   OT1: TTable;
   DS1: TTable;
   Sravn_SkidkiBUF: TADOQuery;
   DataSource6: TDataSource;
   procedure DataModuleCreate(Sender: TObject);
   procedure FIRMBSFilterRecord(DataSet: TDataSet; var Accept: Boolean);
   procedure COMPBSAfterScroll(DataSet: TDataSet);
   procedure CNTRBSFilterRecord(DataSet: TDataSet; var Accept: Boolean);
   procedure ADOConnection1AfterConnect(Sender: TObject);
   procedure OT1FilterRecord(DataSet: TDataSet; var Accept: Boolean);
   procedure DS1FilterRecord(DataSet: TDataSet; var Accept: Boolean);
   procedure HO1FilterRecord(DataSet: TDataSet; var Accept: Boolean);
   procedure OTFilterRecord(DataSet: TDataSet; var Accept: Boolean);
   procedure HOAfterScroll(DataSet: TDataSet);
   procedure DSFilterRecord(DataSet: TDataSet; var Accept: Boolean);
   procedure OTAfterScroll(DataSet: TDataSet);
   procedure HOFilterRecord(DataSet: TDataSet; var Accept: Boolean);
   procedure LOGFilterRecord(DataSet: TDataSet; var Accept: Boolean);
   procedure HIFilterRecord(DataSet: TDataSet; var Accept: Boolean);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 DataModule1: TDataModule1;

implementation

uses Unit19, Unit1, Unit2;

{$R *.dfm}

procedure TDataModule1.DataModuleCreate(Sender: TObject);
begin
try
NastrBase.Open;
LOG.Open;
except
ShowMessage('Ôàéë íàñòðîåê ïîâðåæä¸í èëè íåäîñòóïåí');
end;

try
DataModule1.ADOConnection1.Connected:=false;
DataModule1.ADOConnection1.ConnectionString:=
'Provider=SQLOLEDB.1;Password='+DataModule1.NastrBase.FieldByName('PASSWORD').AsString+
                             ';Persist Security Info=True;User ID='+DataModule1.NastrBase.FieldByName('LOGIN').AsString+
                             ';Initial Catalog=Apteka_New;Data Source='+DataModule1.NastrBase.FieldByName('SERVER').AsString;
DataModule1.ADOConnection1.Connected:=true;
Form1.StatusBar1.Panels[0].Text:='Ñîåäèíåíèå ñ SQL-ñåðâåðîì óñïåøíî';
except
ShowMessage('Ñåðâåð íå äîñòóïåí');
end;
end;

procedure TDataModule1.FIRMBSFilterRecord(DataSet: TDataSet;
 var Accept: Boolean);
begin
if DataSet.FieldByName('Code0').AsInteger=DataModule1.COMPBS.FieldByName('FIRMC132').AsInteger then
       Accept:=true else Accept:=false;
end;

procedure TDataModule1.COMPBSAfterScroll(DataSet: TDataSet);
begin
DataModule1.FIRMBS.Filtered:=true;
DataModule1.CNTRBS.Filtered:=true;
end;

procedure TDataModule1.CNTRBSFilterRecord(DataSet: TDataSet;
 var Accept: Boolean);
begin
if DataSet.FieldByName('Code0').AsInteger=DataModule1.COMPBS.FieldByName('CNTRC134').AsInteger then
       Accept:=true else Accept:=false;
end;

procedure TDataModule1.ADOConnection1AfterConnect(Sender: TObject);
begin
DataModule1.Spr_Aptek.Open;
DataModule1.Spr_Code_OperRashod.Open;
DataModule1.Spr_Code_OperPrihod.Open;
DataModule1.Spr_MagnCard.Open;
//////////////////////////////////////////
DataModule1.LOG.Open;
end;

procedure TDataModule1.OT1FilterRecord(DataSet: TDataSet;
 var Accept: Boolean);
begin
try
if DataSet.FieldByName('SUPPC4').AsString=DataModule1.HO.FieldByName('SUPPC8').AsString then
            Accept:=true else Accept:=false;
except
end;
end;

procedure TDataModule1.DS1FilterRecord(DataSet: TDataSet;
 var Accept: Boolean);
begin
try
if (DataSet.FieldByName('SUPPC4').AsString=DataModule1.OT.FieldByName('SUPPC4').AsString)and
  (DataSet.FieldByName('STRBA28').AsString=DataModule1.OT.FieldByName('STRBA14').AsString) then
       Accept:=true else Accept:=false;
except
end;

end;

procedure TDataModule1.HO1FilterRecord(DataSet: TDataSet;
 var Accept: Boolean);
begin
//if DataSet.FieldByName('DCMSO700').AsInteger=3 then Accept:=false
//        else Accept:=true;
end;

procedure TDataModule1.OTFilterRecord(DataSet: TDataSet;
 var Accept: Boolean);
begin
try
if (DataSet.Active)and(DataModule1.HO.Active) then
       if DataSet.FieldByName('SUPPC4').AsInteger=DataModule1.HO.FieldByName('SUPPC8').AsInteger then
               Accept:=true else Accept:=false;
except
end;
end;


Term   (2005-12-13 13:22:00) [25]


> и зачем нужен таймер этому "самогонному аппарату" ?)

в таймере время до окончания считаю каждые 10 сек


Игорь Шевченко   (2005-12-13 13:21:00) [26]


> Каждый поток работает со свои TDataModule


Код датамодулей в студию


Term   (2005-12-13 13:17:00) [27]


> А где отдельное подключение к базе у каждого потока ?

Каждый поток работает со свои TDataModule


Digitman   (2005-12-13 13:14:00) [28]

везде убрать !


Term   (2005-12-13 13:07:00) [29]


> > Application.ProcessMessages
>
>
> убрать !

внутри
procedure Great_Prihod_Pereliv(zag_dir,zag_filename:string);
procedure GREAT_pereliv(zag_dir,zag_filename:string);


Application.ProcessMessages тоже есть, его тоже убрать?


Digitman   (2005-12-13 13:07:00) [30]

и зачем нужен таймер этому "самогонному аппарату" ?)


Игорь Шевченко   (2005-12-13 13:06:00) [31]

А где отдельное подключение к базе у каждого потока ?


Term   (2005-12-13 13:06:00) [32]

для работы с базой использую АДО

procedure Great_Prihod_Pereliv(zag_dir,zag_filename:string);
procedure GREAT_pereliv(zag_dir,zag_filename:string);


в них в цикле производится вставка в базу, каждая процедура использует свой конект


Digitman   (2005-12-13 13:05:00) [33]


> Application.ProcessMessages


убрать !


Term   (2005-12-13 13:01:00) [34]

вот коды потоков

unit Unit5;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, ComCtrls, Halcn6db;

 procedure Great_Prihod_Pereliv(zag_dir,zag_filename:string);
 function Open_Stroki_Prihod(Stroka:string;var st_dir,st_filename:string):boolean;
 function minuts(param:real):string;
 procedure GREAT_pereliv(zag_dir,zag_filename:string);

 function Open_Stroki_Rashod(var st_dir,st_filename:string):boolean;
 function Open_Skidki:boolean;

 type
 TPrihod = class(TThread)
 private
   { Private declarations }
 protected
   procedure Execute; override;
   procedure Start;
 end;

 type
 TRashod = class(TThread)
 private
   { Private declarations }
 protected
   procedure Execute; override;
   procedure Start;
 end;

var kol_zagolovkov, kol_strok:integer;
   Kol_StrRas_Perelito, Kol_Rashod_Open,n_rashod:integer;

   kol_prihod_open, prihod_perelito,n_prihod:integer;

   Prihod_begin, Rashod_begin:boolean;

   Prihod:TPrihod;
   Rashod:TRashod;

   time1, time2:TTime;

implementation

uses Unit3, Unit3_1, Unit2, Unit4;

////////////ïîòîê ïðèõîäà/////////////////
procedure TPrihod.Execute;
begin
//Synchronize(ConectDB);
Prihod.FreeOnTerminate:=true;
Start;
end;

procedure TPrihod.Start;
begin
Prihod_Zaliv.P_Zagolovki.First;

kol_zagolovkov:=0;
kol_strok:=0;

time1:=0;
Prihod_Zaliv.Timer1.Enabled:=true;
Prihod_Zaliv.Timer2.Enabled:=true;
while not Prihod_Zaliv.P_Zagolovki.Eof do
       begin
       if FileExists(Prihod_Zaliv.P_Zagolovki.FieldByName('DIR').AsString+'\P_temp.cdx') then DeleteFile(Prihod_Zaliv.P_Zagolovki.FieldByName('DIR').AsString+'\P_temp.cdx');
       Prihod_Zaliv.HO_Inx_pr.DatabaseName:=Prihod_Zaliv.P_Zagolovki.FieldByName('DIR').AsString;
       Prihod_Zaliv.HO_Inx_pr.TableName:=Prihod_Zaliv.P_Zagolovki.FieldByName('FILE').AsString;
       Prihod_Zaliv.HO_Inx_pr.Open;
       Prihod_Zaliv.HO_Inx_pr.IndexOn('P_TEMP.cdx','NUMDC4','NUMDC4','',Duplicates, Ascending);
       Prihod_Zaliv.HO_Inx_pr.Close;

       Great_Prihod_Pereliv(Prihod_Zaliv.P_Zagolovki.FieldByName('DIR').AsString, Prihod_Zaliv.P_Zagolovki.FieldByName('FILE').AsString);
       ////////////////
       Prihod_Zaliv.P_Zagolovki.Next;
       end;
Prihod_Zaliv.Timer1.Enabled:=false;
Prihod_Zaliv.Timer2.Enabled:=false;
Prihod_begin:=false;
end;
//////////////////////////////////////////

////////ïîòîê ðàñõîäà/////////////////////
procedure TRashod.Execute;
begin
//Synchronize(ConectDB);
Rashod.FreeOnTerminate:=true;
Start;
end;

procedure TRashod.Start;
begin
Zaliv_Rashod.Zagolovki.First;
time2:=0;
Zaliv_Rashod.Timer1.Enabled:=true;
Zaliv_Rashod.Timer2.Enabled:=true;
while not Zaliv_Rashod.Zagolovki.Eof do
       begin
       GREAT_pereliv(Zaliv_Rashod.Zagolovki.FieldByName('DIR').AsString,Zaliv_Rashod.Zagolovki.FieldByName('FILE').AsString);
       ////////////
       Zaliv_Rashod.Zagolovki.Next;
       Application.ProcessMessages;
       end;
Zaliv_Rashod.Timer1.Enabled:=false;
Zaliv_Rashod.Timer2.Enabled:=false;
Rashod_begin:=false;
end;
//////////////////////////////////////////


Васяня   (2005-12-13 12:51:00) [35]


> Term ©


А провайдер какой?


Term   (2005-12-13 12:47:00) [36]

MSSQL2000


Игорь Шевченко   (2005-12-13 12:46:00) [37]

Тогда без кода затруднительно диагностировать


Васяня   (2005-12-13 12:46:00) [38]

А что за БД?


Term   (2005-12-13 12:41:00) [39]

у каждого потока свой TDataModule, может там где обращаюсь к компонентам, всё делать в Synhronize?


Term   (2005-12-13 12:40:00) [40]


> Обычно для разных потоков рекомендуется делать свое подключение
> к базе данных для каждого потока.

так и есть


Страницы:   1 2 3

Наверх

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