کد اول اشتباه هست. چون هم دارید PostMessage می کنید، هم دارید Synchronize را فراخوانی می کنید. قبلا هم توضیح دادم که وقتی متد Synchronize را فراخوانی می کنید، در واقع Thread شما متوقف میشه، کد تابع مورد نظر شما در Thread اصلی برنامه (نه Threadایی که خودتون ساختید)، اجرا میشه، و بعد از اتمام تابع، ،Thread شما به کار خودش ادامه میده. پس اگر حجم بزرگی از کدهای شما توسط متد Synchronize اجرا بشه، عملا بخش بزرگی از کد شما در داخل همان Thread اصلی اجرا میشه، و شما منفعت خاصی از ایجاد Thread جدید بدست نمیارید.من با توجه به آنچه شما گفتید ابتدا execute رو به صورت زیر تغییر دادم
Synchronize یک راه ساده برای تغییر رابط کاربر گرافیکی برنامه از سایر Thread ها (غیر از Thread اصلی) هست. اگر تغییراتی که در رابط کاربر اعمال می کنید (مثلا نمایش Progress bar) ساده هستند، استفاده از Synchronize مشکل خاصی بوجود نمیاره، ولی اگر کدهای تغییر رابط کاربر پیچیده باشند، استفاده از Synchronize مزیت استفاده از Thread را از بین میبره. در اون صورت باید از روش های دیگه ایی برای بروزرسانی رابط کاربر استفاده کنید، مثل ارسال Message به فرم مورد نظر، یا استفاده از هر یک از Synchronization Objectهای سیستم عامل، مثل Event, Critical Section, Mutex، و غیره.
در کد شما، از آنجایی که کدهایی که قرار دارید همگی مرتبط با بانک اطلاعاتی هستند، و ربط خاصی به رابط کاربر ندارند، نیازی به استفاده از متد Synchronize یا سایر روش های همزمان سازی نیست، و کد دوم پست قبلی شما باید بدون مشکل کار کنه.
در ضمن، در داخل متد Execute نیازی به فراخوانی Terminate نیست؛ هر وقت که اجرای Execute تمام شود، Thread مربوطه Terminate می شود. ثانیا، Exit برای خروج از یک تابع است. در پایان یک تابع، بطور خودکار از تابع خارج می شوید، پس نیازی به Exit در انتهای متد Execute هم نیست.