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. "
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;
progressbar1.Maximum:=sqlcommandlist.Count-1; sema_threads_running:=0; sema_threads_completed:=0; for i:=0 to sqlcommandlist.Count-1 do begin 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
Narses: Code- durch Delphi-Tags ersetzt