ورود

View Full Version : IdTcpClient و دريافت توسط يك Thread و مشكل در استفاده از دستور ShowModal در آن



seyed_farid
شنبه 15 مهر 1391, 10:44 صبح
من جهت دريافت اطلاعات IdTcpClient از يك ترد استفاده ميكنم و با دريافت كاراكتر خاصي مي بايست فرمي را ShowModal كنم ولي با دستور ShowModal برنامه هنگ ميكند.:ناراحت: مشكل چگونه حل مي شود؟:تشویق:

ضمناً من از كمپوننت زير استفاده كرده ام.

Mask
شنبه 15 مهر 1391, 14:02 عصر
سلام دوست من
سوالتون مربوط به بخش شبکه دلفی هست. چرا اینجا مطرح کردید؟
در مورد :

من جهت دريافت اطلاعات IdTcpClient از يك ترد استفاده ميكنم
چه نیازی به این کامپوننت هست برای کار با شبکه وقتی مجموعه hndy با این عظمت وجود داره.
مورد بعدی : چرا برای دریافت اطلاعات از TcpClient استفاده میکنید؟ بهترین کامپوننت و راههترین TcpServer هست.

فرمي را ShowModal كنم ولي با دستور ShowModal برنامه هنگ ميكند
تا حالا چندین بار من و دوستان توضیح دادند. در تردی به غیر از مین ترد با GUI ارتباط برقرار نکنید.
بهتره این پیغام رو بر روی مین ترد ارسال و در اونجا این عملیات رو انجام بدید.

Delphi Coder
یک شنبه 16 مهر 1391, 01:54 صبح
من جهت دريافت اطلاعات IdTcpClient از يك ترد استفاده ميكنم و با دريافت كاراكتر خاصي مي بايست فرمي را ShowModal كنم ولي با دستور ShowModal برنامه هنگ ميكند.:ناراحت: مشكل چگونه حل مي شود؟:تشویق:

ضمناً من از كمپوننت زير استفاده كرده ام.
وقتی از داخل Thread می خواهید کاری در interface انجام دهید یا یک روتین بنویسید و آن را داخل sunchronize قرار دهید یا یک message با استفاده از PostMessage به هندل فرم اصلی بفرستید و در message handler فرم این کار را انجام دهید. شما مستقیما از داخل Thread نمی تونید در اینترفیس برنامه تغییر بدبد حتی در حد تغییر یک caption.
message handler هم در تعریف کلاس فرم اینجوری می تونید تعریف کنید
procedure HandleMyThreadMessage(var Msg: TMessage); message WM_USER+1;

این سورسایی که گذاشتید برای کار با سوکت ممکن هست کارتونو راه بندازه ولی زیاد خوب نیست من Indy رو پیشنهاد میکنم.

seyed_farid
یک شنبه 16 مهر 1391, 03:39 صبح
ممنون
اما این کومپوننت مگه با ایندی ساخته نشده؟ ! از TIdTCPClient ساخته شده. چه مشکلی میتونه ایجاد کنه؟

Delphi Coder
یک شنبه 16 مهر 1391, 12:42 عصر
ممنون
اما این کومپوننت مگه با ایندی ساخته نشده؟ ! از TIdTCPClient ساخته شده. چه مشکلی میتونه ایجاد کنه؟
بله ولی خیلی قدیمیه این از ورژن 9 استفاده کرده. در کل اگر bug نداشته باشه میتونه کار شما رو راه بندازه SynchronizeEvents رو True کنید مشکلتون باید حل بشه.

seyed_farid
یک شنبه 16 مهر 1391, 23:21 عصر
وقتی از داخل Thread می خواهید کاری در interface انجام دهید یا یک روتین بنویسید و آن را داخل sunchronize قرار دهید یا یک message با استفاده از PostMessage به هندل فرم اصلی بفرستید و در message handler فرم این کار را انجام دهید. شما مستقیما از داخل Thread نمی تونید در اینترفیس برنامه تغییر بدبد حتی در حد تغییر یک caption.
message handler هم در تعریف کلاس فرم اینجوری می تونید تعریف کنید
procedure HandleMyThreadMessage(var Msg: TMessage); message WM_USER+1;


با نوشتن یک پروسیجر و قرار دادن آن در Syncronize نیز مشکل حل نشد و برای ارسال یک متن با PostMessage چطور باید کار کنم؟ میشه یک نمونه بدید؟ ممنون :تشویق:

seyed_farid
دوشنبه 17 مهر 1391, 08:47 صبح
در تردی به غیر از مین ترد با GUI ارتباط برقرار نکنید.
بهتره این پیغام رو بر روی مین ترد ارسال و در اونجا این عملیات رو انجام بدید.

دوست عزيز ميشه بيشتر راهنمائيم كنيد؟:تشویق:

Felony
دوشنبه 17 مهر 1391, 10:42 صبح
برنامه ضمیمه پست شماره 47 این تاپیک (http://barnamenevis.org/showthread.php?209792-%D8%B3%D9%88%D8%B1%D8%B3%D9%87%D8%A7%D9%8A-%D9%86%D9%85%D9%88%D9%86%D9%87-%D8%A2%D9%85%D9%88%D8%B2%D8%B4%D9%8A/page5) رو دانلود کنید ، با مطالعه کد مربوط به بخش Sync و ارسال پیغام میتونید عملیات مورد نظر رو پیدا کنید .

seyed_farid
چهارشنبه 19 مهر 1391, 17:13 عصر
ممنون از راهنمائيتون
من با قرار دادن يك استرينگ و مقدار دهي اون تو تريد و با تايمري كه تو برنامه داشتم وضعيت اين استرينگ رو چك ميكنم. اگر خالي نبود اون كاري را كه ميخوام باهاش ميكنم و بعد خاليش ميكنم.:چشمک:
فعلاً اينطوري حلش كردم و مشكلي هم نداره.:لبخندساده: