بسم الله الرحمن الرحيم
السلام عليك ورحمة الله وبركاته ..
هل يمكن منع البرنامج من التجمد اثناء البحث (قاعدة البيانات تقريبا 800 ميغا)
والسلام عليكم
اجل اجعل عملية بحث في ثريد منفصل
راقب مدة اشتغال ثريد ادا زادت عند وقت معين عشر ثواني - دقيقة timeout ولو تنتهي من بحث نبه مستخدم و اغلق ثريد لينتهي بحث
شكرا لك أخي هوديني ممكن مثال
لأني لم أتعامل بالثريد من قبل
يمكنك العثور على عدة امثله في نت ان استعمال ثريد فقط استثناء لو كنت تستعمل ado connection لقواعد بيانات فلا يمكن ان تشارك مجموعة من ثريد نفس اتصال
يجب لكا اتصال ثريد منفصل
كود :
TADOSQLThread = class(TThread)
private
FADOQ: TADOQuery; // Internal query
FSQL: string; // SQL To execute
FID: integer; // Internal ID
public
constructor Create(CreateSuspended:Boolean; AConnString:String;
ASQL:string; IDThread:integer);
destructor Destroy; override;
procedure Execute(); override;
property ID:integer read FID write FID;
property SQL:string read FSQL write FSQL;
property ADOQ:TADOQuery read FADOQ write FADOQ;
end;
الباني معدل ليناسبنا و يبدوا هكداا
كود :
constructor TADOSQLThread.Create(CreateSuspended:Boolean; AConnString:String;
ASQL:string; IDThread:integer);
begin
inherited Create(CreateSuspended);
// ini
Self.FreeOnTerminate := False;
// Create the Query
FADOQ := TAdoquery.Create(nil);
// assign connections
FADOQ.ConnectionString := AConnString;
FADOQ.SQL.Add(ASQL);
Self.FID := IDThread;
Self.FSQL:= ASQL;
end;
تنفيد ثريد بسيط في دالة excu
كود :
procedure TADOSQLThread.Execute();
begin
inherited;
try
// Ejecutar la consulta
Self.FADOQ.Open;
except
// Error al ejecutar
...Error treattement
end;
end;
لبدء ثريد هكداا
كود :
//crear el Thread
th := TADOSQLThread.Create(True, mmConnection.Lines.Text, ASQL, AId);
// internal for me (for controled the number of active threads and limete it)
inc(numThreads);
// evento finalizacion
th.OnTerminate := TerminateThread;
// Ejecutarlo
th.Resume;
قمنا بربط ثريد مع دالة انتهاء TerminateThread لتنبهنا عند انتهاء ثريد
هدا كل ما فس الامر
مثال من stackoverflow.
وعليكم اسلام ورحمة الله
إقتباس :هل يمكن منع البرنامج من التجمد اثناء البحث (قاعدة البيانات تقريبا 800 ميغا)
أعد التفكير في تصميم قاعدة البيانات وكيفية استخدام البحث وما له علاقة
نوع قاعدة البيانات / كيفية الاتصال / كيفية البحث، جدول Table /استعلام SQL ، الادلة الفريدة Index
السلام عليكم او باستخدام مكونات حفظ البيانات في الذاكرة مثل TClientDataSet او KBMTable
شكرا لك أخي هوديني على المثال ..
سأحاول العمل به علما أني لم أستحدم الثريد من قبل
شكرا لكم اخواني. عبد العزيز . فاتح .
أنا أستعمل قاعدة بيانات أكسس وحجمها كما قلت تقريبا 800 ميغا
تتكون من الاسم اللقب ورقم الهاتف ....
والمعلومات الناتجة بعد البحث تعرض في Dbgrid و Label
فما نصيحتكم
+
وهل يمكن البحث في القاعدة مثل محرر نصوص الوندوز
أي تبحث عن اسم يظهر الناتج و تظغط مرة أخرى ويظهر الاسم المشابه وهكذا
وشكرا لكم مرة أخرى
إقتباس :هل يمكن البحث في القاعدة مثل محرر نصوص الوندوز
أي تبحث عن اسم يظهر الناتج و تظغط مرة أخرى ويظهر الاسم المشابه وهكذا
طبعا ممكن.
إقتباس :قاعدة بيانات أكسس وحجمها كما قلت تقريبا 800 ميغا
تتكون من الاسم اللقب ورقم الهاتف ....
كم من سجل ؟
b.m.abdelaziz كتب :طبعا ممكن.
كم من سجل ؟
اذا أمكن كيف لأني لم أجد في النت أي شرح أو حتى تلميح
....
قاعدة البينات تحتوي على مايقارب 18000000
وجدت كتاب عربي يتكلم عن الثريد
و تمكنت بحل مشكل الثقل والحمد لله باستخدام الثريد
السلام عليكم
إقتباس :قاعدة البينات تحتوي على مايقارب 18000000
* هل تقوم بجلب كل السجلات ؟
يمكنك تحديد عدد السجلات المجلوبة ( لا أظن أن المستخدم يحتاج 18 مليون سجل دفعة واحدة ، بالعكس تسبب له الصداع :eek: )
* ما مكونات الإتصال ؟ إذا كانت FireDac-AnyDac يمكن تحديد عدد السجلات المجلوبة RowsetSize ، أظن أن Unidac .. لها خاصية مشابهة
كما يمكن تحديدها 'عدد السجلات المجلوبة' يدويا ( برمجيا)
http://delphi4arab.net/forum/showthread.php?tid=8890
بالتوفيق