Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.01.01;
Скачать: CL | DM;

Вниз

Обработка в потоках   Найти похожие ветки 

 
Term ©   (2005-12-13 12:08) [0]

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

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

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


 
Васяня   (2005-12-13 12:10) [1]

Управление трансзакциями? :)


 
Reindeer Moss Eater ©   (2005-12-13 12:14) [2]

Что можете посоветовать
Быть внимательным


 
Term ©   (2005-12-13 12:17) [3]

транзакция в каждом потоке своя...

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


 
Reindeer Moss Eater ©   (2005-12-13 12:19) [4]

У тебя ошибка в 17 строке


 
Васяня   (2005-12-13 12:21) [5]


> Term ©  

Я не имею ввиду непосредственную трансзакцию записи в БД... наверное не правильную формулировку я дал, скорее я имел ввиду что тебе надо чтобы потоки неким образом были связаны и было понятно что и какой из них что делает...

Я не знаю что именно там у тебя происходит в потоках, но может вдруг у тебя один удаляет строку, а другой ее модифицирует и отсюда калапс?


 
Term ©   (2005-12-13 12:27) [6]


> Я не знаю что именно там у тебя происходит в потоках, но
> может вдруг у тебя один удаляет строку, а другой ее модифицирует
> и отсюда калапс?


нет в том то и дело работают с разными таблицами!!!! они вообще нигде не пересекаются!!!


 
Игорь Шевченко ©   (2005-12-13 12:28) [7]

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


 
Term ©   (2005-12-13 12:40) [8]


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

так и есть


 
Term ©   (2005-12-13 12:41) [9]

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


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

А что за БД?


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

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


 
Term ©   (2005-12-13 12:47) [12]

MSSQL2000


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


> Term ©


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


 
Term ©   (2005-12-13 13:01) [14]

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

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;
//////////////////////////////////////////


 
Digitman ©   (2005-12-13 13:05) [15]


> Application.ProcessMessages


убрать !


 
Term ©   (2005-12-13 13:06) [16]

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

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


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


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

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


 
Digitman ©   (2005-12-13 13:07) [18]

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


 
Term ©   (2005-12-13 13:07) [19]


> > 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:14) [20]

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


 
Term ©   (2005-12-13 13:17) [21]


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

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


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


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


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


 
Term ©   (2005-12-13 13:22) [23]


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

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


 
Digitman ©   (2005-12-13 13:26) [24]

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


 
Term ©   (2005-12-13 13:26) [25]

вот 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:27) [26]

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

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.


 
Term ©   (2005-12-13 13:27) [27]

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


 
Term ©   (2005-12-13 13:31) [28]

проблема в том что не в потоке все работает нормально, а в потоках начинаются глюки


 
Term ©   (2005-12-13 13:38) [29]

что нет так ??? вроде всё простенько


 
Игорь Шевченко ©   (2005-12-13 13:38) [30]

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


 
Term ©   (2005-12-13 13:42) [31]


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


ну я же так и делаю два TDataModule, для каждого потока свой, и там для каждого потока свой TADOConnection, вроде так и есть....


 
Term ©   (2005-12-13 13:51) [32]

Удалено модератором
Примечание: Создание пустых сообщений


 
Term ©   (2005-12-13 13:52) [33]

Удалено модератором
Примечание: Создание пустых сообщений


 
Игорь Шевченко ©   (2005-12-13 13:54) [34]

Ты напиши свой пример из трех строк, с двумя потоками и двумя датамодулями, убрав все неотносящееся к проблеме. Мазохистов нету такой код смотреть, в котором три дня разбираться надо.


 
evvcom ©   (2005-12-13 14:10) [35]


> в котором три дня разбираться надо

во-во, и мне лень.
2автор: Ответь-ка на вопрос. Там у тебя TDataSource есть, ты случаем где-нить в дбгриде или типа того не отображаешь эти НД?

> то TGauge начинает глючить (отрисовывается неправильно)

а его где и как показываешь?


 
Term ©   (2005-12-13 14:24) [36]


> 2автор: Ответь-ка на вопрос. Там у тебя TDataSource есть,
>  ты случаем где-нить в дбгриде или типа того не отображаешь
> эти НД?


да есть..... просветите как оно нужно в этом случае

значит оно так на форме есть грид в нём список файлов для обработки
по списку бежит вот этот кусок

////////////ïîòîê ïðèõîäà/////////////////
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;
//////////////////////////////////////////


в процедуре Great_Prihod_Pereliv(Prihod_Zaliv.P_Zagolovki.FieldByName("DIR").AsString, Prihod_Zaliv.P_Zagolovki.FieldByName("FILE").AsString);

бежит по таблицам, эти данные нигде в грид не выводятся, только увеличивается прогресс у TGauga, и еще на статус бар отображается количество обработанных записей


 
Digitman ©   (2005-12-13 14:29) [37]


> Term ©   (13.12.05 14:24) [36]


обращения к визуальным VCL-контролам в контексте НЕосновного код.потока НЕдопустимы !


 
Term ©   (2005-12-13 14:33) [38]


> обращения к визуальным VCL-контролам в контексте НЕосновного
> код.потока НЕдопустимы !

а скажем если нужно чтото вывести на статус бар, это должно быть в Synchronize ?


 
Term ©   (2005-12-13 14:40) [39]


> обращения к визуальным VCL-контролам в контексте НЕосновного
> код.потока НЕдопустимы !


да же в том случае если для каждого потока DBGrid свой?


 
Term ©   (2005-12-13 14:48) [40]

Удалено модератором
Примечание: Создание пустых сообщений



Страницы: 1 2 вся ветка

Текущий архив: 2006.01.01;
Скачать: CL | DM;

Наверх




Память: 0.59 MB
Время: 0.032 c
2-1134730235
oleggar
2005-12-16 13:50
2006.01.01
archives


2-1134835239
RX
2005-12-17 19:00
2006.01.01
общие переменные


2-1134489818
Antonio
2005-12-13 19:03
2006.01.01
Широковещательный UDP


1-1133429644
slaga
2005-12-01 12:34
2006.01.01
Какой софт использовать для проектирования объектов в Delphi.


14-1133876836
Sergunchik
2005-12-06 16:47
2006.01.01
Помогите пожалуйста!!!!