السلام عليكم
أود إضافة حوالي 200000 سجل بإستعمال ثريد
عند عدم استعمال ثريد العملية تنجح
وعند استعمال تفشل العملية ? :confused:
عموما المرفق يوaح كل شيء
و عليكم السلام
المشكل أنك تستخدم thread غير آمن non safe ..
للتخاطب مع المكونات من داخل الثريد عليك أن تستخدم الدالة Synchronize للقراءة أو الكتابة
ألق نظرة .. لقد عدلت على المثال :
procedure TForm1.Button1Click(Sender: TObject); var I: Integer; begin Terminated := False; for I := 1 to 100 do begin ADOTable1.Append; ADOTable1.FieldByName('Items').AsString := 'Item ' + IntToStr(I); ADOTable1.Post; Application.ProcessMessages; if Terminated then Break; end; end;
{ TTHR }
procedure TTHR.SafeAccessDB; var I: Integer; begin for I := 1 to 1000 do begin Form1.ADOTable1.Append; Form1.ADOTable1.FieldByName('Items').AsString := 'Item ' + IntToStr(I); Form1.ADOTable1.Post; if Terminated then Break; end; end;
procedure TTHR.Execute; begin FreeOnTerminate := True; Synchronize(SafeAccessDB); end;
procedure TForm1.Button2Click(Sender: TObject); begin THR := TTHR.Create(True); THR.Resume; end;
procedure TForm1.Button3Click(Sender: TObject); begin Terminated := True; end;
procedure TForm1.Button4Click(Sender: TObject); begin ADOTable1.Close; ADOConnection1.Close; end;
end.
+
استخدم FreeOnTerminate حتى يتم تحرير الثريد بشكل تلقائي
----------------------------------------------
لكن مع هذا ستلاحظ تجمد في واجهة المستخدم لأن أغلب مكونات دلفي لا تدعم مصطلح safe thread
يتوجب عليك في هذه الحالة :
أن تضع أكواد الاتصال داخل الثريد .. (يجب أن تنشئ المكونات يدويا داخل ال constructor
procedure TForm1.Button1Click(Sender: TObject); var I: Integer; begin Terminated := False; for I := 1 to 200000 do begin ADOTable1.Append; ADOTable1.FieldByName('Items').AsString := 'Item ' + IntToStr(I); ADOTable1.Post; Application.ProcessMessages; if Terminated then Break; end; end;
{ TTHR }
procedure TTHR.SafeAccessDB; var I: Integer; begin for I := 1 to 200000 do begin FADOTable.Append; FADOTable.FieldByName('Items').AsString := 'Item ' + IntToStr(I); FADOTable.Post; if Terminated then Break; end; end;
smart24 كتب :لما لا تنشئ procedure جديد
ثم تستخدم CreateThread
النتيجة واحد
لذلك يفضل استخدام ال vcl بدل توابع api
ستدخل في مشاكل كثيرة باستخدام الدالة CreateThread
الدالة CreateThread تستعمل للدوال الصغيرة فقط , أما في المشاريع الكبيرة فلا أنصح باستعمال توابع
api .
dztr كتب :بارك الله فيك SMP3 الأن كل شيء واضح
ممكن تنصحني بأسرع طريقة لإضافة 200000 سجل في زمن قياسي
ليست هناك طريقة : الأمر مرتبط بالدرايفر المستخدم لقاعدة البيانات + بنية و هيكل قاعدة البيانات