Autor Beitrag
MisterAHA
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 16



BeitragVerfasst: So 01.02.09 14:09 
hallo leute,

es geht bei unserem tool darum, dass durch mehrere algorithmen eine temp-table gefüllt wird. dies muss parallel geschehen, da die nachfolgenden schritte von dieser temp-table abhängig sind.
die temp-table hat für uns sehr viele vorteile, darum muss sie auch bleiben!
es gilt nun eine lösung zu finden, alle threads nur eine connection nutzen lassen, wobei ALLE threads auch ALLE zur zeit befindlichen daten in der temp-table sehen müssen. (jeder thread muss also wissen, wie weit der andere gerade mit der "befüllung" der temp-table ist!)
anhand des quelltextes siehst du, wie wir das versucht haben, dabei ist allerdings besagter fehler aufgetreten.
vielleicht gibt es ja auch eine ganz andere lösung für unser problem, dass wir gerade nicht sehen!?

"ReceiveHeader: Net packets out of order: received[1], expected[2]"

"Multiple MyCommands over one MyConnection.
Only one connection can be used because there are temporary tables. "

ausblenden volle Höhe Delphi-Quelltext
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:
type SQLQueryThread=class(TThread) 
private 
sqlstr:ansistring; 
public 
constructor Create(querystr:ansistring); 
procedure Execute; override
destructor Destroy; override
end

var sema_threads_running,sema_threads_completed:integer; 

constructor SQLQueryThread.Create(querystr:ansistring); 
begin 
inherited Create(false); 
sqlstr:=querystr; 
inc(sema_threads_running); 
end

procedure SQLQueryThread.Execute; 
var dbcmd:TMyCommand; 
begin 
dbcmd:=TMyCommand.Create(frm_search_database); 
dbcmd.CommandTimeout:=3000
dbcmd.ParamCheck:=false; 
dbcmd.Prepared:=false; 
dbcmd.Connection:=frm_main.MyConnection1; 
dbcmd.SQL.Add(sqlstr); 
dbcmd.Execute; 
dbcmd.Free; 
end

destructor SQLQueryThread.Destroy; 
begin 
dec(sema_threads_running); 
inc(sema_threads_completed); 
inherited Destroy; 
end


//this part uses the threads 

progressbar1.Maximum:=sqlcommandlist.Count-1
sema_threads_running:=0
sema_threads_completed:=0
for i:=0 to sqlcommandlist.Count-1 do 
begin 
//alle befehle uebertragen 
SQLQueryThread.Create(sqlcommandlist.Strings[i]); 
repeat 
application.ProcessMessages; 
sleep(1); 
until(sema_threads_running<maxquerythreads); 
progressbar1.Position:=sema_threads_completed; 
end
repeat 
application.ProcessMessages; 
sleep(1); 
progressbar1.Position:=sema_threads_completed; 
until(sema_threads_running=0);


hat einer von euch eine idee?

mfg andreas

Moderiert von user profile iconNarses: Code- durch Delphi-Tags ersetzt
Bernhard Geyer
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 721
Erhaltene Danke: 3



BeitragVerfasst: So 01.02.09 16:52 
Crosspost bei Delphi-Praxis: www.delphipraxis.net...ts+out+of+order.html