Форум: "Начинающим";
Текущий архив: 2006.01.01;
Скачать: [xml.tar.bz2];
ВнизОбработка в потоках Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.58 MB
Время: 0.012 c