PDA

View Full Version : به‌روزرسانی TextBox , ProgressBar



mhjbarnamenevis
سه شنبه 14 اسفند 1397, 10:19 صبح
سلام دوستان.
می‌خواهم TextBox , ProgressBar را به‌روزرسانی کنم. ولی فهمیدم که وسط یک کار دیگر نمی‌شود اینها را به‌روزرسانی کرد.
بعد پاسخ‌های اینترنتی را که جستجو می‌کردم متوجه شدم که این کار را باید به وسیله‌ی ایجاد یک Thread دیگر انجام داد. ولی نفهمیدم دقیقا چگونه. (همان برنامه‌ای که ارایه دادند را می‌نویسم ایراد می‌گیرد)
بعد یک سری دیگر گفته‌اند انگار طریقه‌ی اصولی برخورد با این مشکل این است که از Worker Threads and SwingWorker (https://docs.oracle.com/javase/tutorial/uiswing/concurrency/worker.html)استفاده کنم. ولی باز هم آموزش‌ها در این خصوص شفاف نیست. چه چیزی را باید دقیقا کجا قرار دهم؟
از دوستان اگر کسی به این مسایل آشنایی دارد درخواست راهنمایی دارم.
سپاس.

farhad_shiri_ex
سه شنبه 14 اسفند 1397, 12:02 عصر
سلام دوستان.
می‌خواهم TextBox , ProgressBar را به‌روزرسانی کنم. ولی فهمیدم که وسط یک کار دیگر نمی‌شود اینها را به‌روزرسانی کرد.
بعد پاسخ‌های اینترنتی را که جستجو می‌کردم متوجه شدم که این کار را باید به وسیله‌ی ایجاد یک Thread دیگر انجام داد. ولی نفهمیدم دقیقا چگونه. (همان برنامه‌ای که ارایه دادند را می‌نویسم ایراد می‌گیرد)
بعد یک سری دیگر گفته‌اند انگار طریقه‌ی اصولی برخورد با این مشکل این است که از Worker Threads and SwingWorker (https://docs.oracle.com/javase/tutorial/uiswing/concurrency/worker.html)استفاده کنم. ولی باز هم آموزش‌ها در این خصوص شفاف نیست. چه چیزی را باید دقیقا کجا قرار دهم؟
از دوستان اگر کسی به این مسایل آشنایی دارد درخواست راهنمایی دارم.
سپاس.

جهت بر روز رسانی یک progress bar باید از طریق نخ اصلی main thread ui به این آبجکت دسترسی پیدا کنید و مقادیری که لازم دارید اعمال کنید بنابراین کافی که یک نخ کارگر ایجاد کنید و عملیاتی که لازم دارید را در این نخ انجام دهید وکافی در زمانهای مناسب در نخ کارگر جدید مقادیر درصد پیشرفت را به نخ اصلی ارسال کنید و چون فقط در نخ اصلی به آبجکتهای UI دسترسی دارید حالا مقادیر فوق را در آبجکت نمایش دهید.
در صورتی هم که نیازی به چند نخ مختلف جهت انجام عملیات خود ندارید خیلی هم نیازی به رعایت همه تکنیکهای برنامه نویسی چند نخی در جهت رخ ندادن race condition بر روی داده های مشترک ندارید
یا به صورت واضح تر
1- ایجاد یک نخ کارگر
2- استارت عملیات مورد نظرتون در نخ فوق
3- تعیین یک داده atomic حالا یا استاتیک ویا غیر استاتیک جهت درج درصد پیشرفت در زمان های مناسب در نخ کارگر
4- به روز رسانی نخ اصلی برنامه و به روز رسانی کنترل progress bar و اعمال داده اتمیک در کنترل فوق
به همین سادگی مشکلی بود اطلاع دهید

mhjbarnamenevis
چهارشنبه 15 اسفند 1397, 15:06 عصر
جهت بر روز رسانی یک progress bar باید از طریق نخ اصلی main thread ui به این آبجکت دسترسی پیدا کنید و مقادیری که لازم دارید اعمال کنید بنابراین کافی که یک نخ کارگر ایجاد کنید و عملیاتی که لازم دارید را در این نخ انجام دهید وکافی در زمانهای مناسب در نخ کارگر جدید مقادیر درصد پیشرفت را به نخ اصلی ارسال کنید و چون فقط در نخ اصلی به آبجکتهای UI دسترسی دارید حالا مقادیر فوق را در آبجکت نمایش دهید.
در صورتی هم که نیازی به چند نخ مختلف جهت انجام عملیات خود ندارید خیلی هم نیازی به رعایت همه تکنیکهای برنامه نویسی چند نخی در جهت رخ ندادن race condition بر روی داده های مشترک ندارید
یا به صورت واضح تر
1- ایجاد یک نخ کارگر
2- استارت عملیات مورد نظرتون در نخ فوق
3- تعیین یک داده atomic حالا یا استاتیک ویا غیر استاتیک جهت درج درصد پیشرفت در زمان های مناسب در نخ کارگر
4- به روز رسانی نخ اصلی برنامه و به روز رسانی کنترل progress bar و اعمال داده اتمیک در کنترل فوق
به همین سادگی مشکلی بود اطلاع دهید
سلام فرهاد عزیز.
اینجا دکمه‌ی تشکر ندارد (دست کم برای من) و همین‌جوری لفظی از لطفی که کردید تشکر می‌کنم.
.
.
.
حقیقتش من مبتدی هستم و این چیزهایی که فرمودید بیشتر من را گیج کرد! :افسرده::گیج:
من اصلا با نخ‌ها آشنایی ندارم و نمی‌دانم این نخ اصلی کجاست! (همان تابع main است؟ که مسلما نیست... جایی از برنامه من هم که واژه thread ندارد که من بخواهم بررسی‌اش کنم... :گیج:)
پس اجازه بفرمایید یک مقدار در مورد نخ‌ها (و جایی که باید نخ دوم را افزود و ...) بررسی کنم دوباره مزاحمتان بشوم.

mhjbarnamenevis
چهارشنبه 15 اسفند 1397, 15:16 عصر
اما تا من بررسی بکنم...
۱- آیا این چند نخ کاری، باعث افت قدرت کار در نخ اصلی نمی‌شود؟ (یعنی ما تنها از نخ دوم انتظار داریم چند تا جعبه متنی را به روز رسانی کند... ولی یک باره نمی‌آید ۳۰-۴۰ درصد از قدرت نخ اصلی را بگیرد؟)
۲- آیا این نقص جاوا (کتابخانه‌های موجود جاوا swing) نیست که این کارها را خودشان به عهده نمی‌گیرند و باید برایشان برنامه اضافه نوشت؟ البته من در ترازی نیستم که اصلا بخواهم در این باره اظهار نگر کنم... ولی به نگرم اینها باید تنها با یک فعال یا غیر فعال کردن یک متغیر ساده (یک آرگومان) خود به خود انجام می‌شد... باید در نرم‌افزارهای ادیتور (netbeans) یک همچنین چیزی به صورت بصری گنجانده می‌شد... که آیا دوست داری این خودکار مقادیرش تغییر کند؟ در چه بازه‌ای دوست داری؟ در هنگام انجام کلیه توابع؟ یا در هنگام انجام چند تابع خاص؟ و ... احتمالا نوشتنش سخت هم نیست! نمی‌دانم چرا همچنین چیزی را انجام نداده‌اند...

farhad_shiri_ex
چهارشنبه 15 اسفند 1397, 15:43 عصر
من اصلا با نخ‌ها آشنایی ندارم و نمی‌دانم این نخ اصلی کجاست! (همان تابع main است؟ که مسلما نیست... جایی از برنامه من هم که واژه thread ندارد که من بخواهم بررسی‌اش کنم... )

خیلی ساده بخوام توضیح بدم !
هر برنامه ای که شما در سیستم عامل اجرا میکنید درون یک پردازه قرار میگیره که داخل همین پردازه یک نخ اصلی وجود داره که وظیفه کنترل برنامه و المانهای گرافیکی و خیلی چیزهای دیگه را داره!
و دقیقا تابع main برنامه محل نخ اصلی برنامه هم هست.


۱- آیا این چند نخ کاری، باعث افت قدرت کار در نخ اصلی نمی‌شود؟ (یعنی ما تنها از نخ دوم انتظار داریم چند تا جعبه متنی را به روز رسانی کند... ولی یک باره نمی‌آید ۳۰-۴۰ درصد از قدرت نخ اصلی را بگیرد؟)

نه ربطی نداره! بحث تامین منابع سخت افزاری نخ ها به عهده سیستم عامل و پردازشگر هست بنابراین استفاده از نخ ها نمیتونه بر روی تامین منابع سخت افزاری نخ های دیگر برنامه ویا نخ اصلی برنامه خللی وارد کنه!
البته در صورتی که در استفاده از نخ ها دچار زیاده روی شوید قطعا در کارایی برنامه تاثیر خواهد گذاشت



۲- آیا این نقص جاوا (کتابخانه‌های موجود جاوا swing) نیست که این کارها را خودشان به عهده نمی‌گیرند و باید برایشان برنامه اضافه نوشت؟ البته من در ترازی نیستم که اصلا بخواهم در این باره اظهار نگر کنم... ولی به نگرم اینها باید تنها با یک فعال یا غیر فعال کردن یک متغیر ساده (یک آرگومان) خود به خود انجام می‌شد... باید در نرم‌افزارهای ادیتور (netbeans) یک همچنین چیزی به صورت بصری گنجانده می‌شد... که آیا دوست داری این خودکار مقادیرش تغییر کند؟ در چه بازه‌ای دوست داری؟ در هنگام انجام کلیه توابع؟ یا در هنگام انجام چند تابع خاص؟ و ... احتمالا نوشتنش سخت هم نیست! نمی‌دانم چرا همچنین چیزی را انجام نداده‌اند...

خیر دوست عزیز! ربطی به جاوا نداره تمامی محیط های برنامه نویسی همینطور هستند یعنی نرم افزاری که در این زبانها تولید میشه یک نخ اصلی دارند در یک پردازه اصلی
اینکه شما می فرمایید که بایک فعال و غیر فعال کردن متغیر باید انجام میشد؟! تا حالا به غیر از جاوا تو کدوم محیط برنامه نویسی کردید که چنین استنباطی کردید؟ به هرحال حتی محیطهای برنامه نویسی قدیمی هم که single thread apartement بودند هم باز یک نخ اصلی داشتند فقط مشکلی که داشتند این بود که از چند نخی پشتیبانی نمیکردند.
بنابراین وقتی بخواهید با المانهای گرافیکی فرمهایی که دارید در ارتباط باشید باید در همان نخ صاحب المان همون نخ اصلی برنامه در تعامل باشید مثلا برای کاری که شما می خواهید انجام بدید حتما هم لازم نیست که از نخ های دیگه ای استفاده کنید می تونید در همون نخ اصلی هم عملیات هایی که لازم دارید انجام بدید یعنی امکان اضافه کردن عملیاتها ویا فرآیندهایی در زمان اجرا به نخ اصلی وجود دارد. ولی خیلی روش بهینه ای نخواهد بود.
ودر آخر هم همانطور که خودتون گفتید بهتره کمی درباره نخ ها مطالعه داشته باشید و سعی کنید مثالهای مختلف راهم انجام بدید فقط توجه داشته باشید که به علت پیچیدگی هایی که در برنامه نویسی چند نخی و همزمانی و موازی سازی وجود داره سعی کنید که کم کم به این مباحث و تکنیک ها آشنایی پیدا کنید

mhjbarnamenevis
چهارشنبه 15 اسفند 1397, 15:55 عصر
خیلی ساده بخوام توضیح بدم !
هر برنامه ای که شما در سیستم عامل اجرا میکنید درون یک پردازه قرار میگیره که داخل همین پردازه یک نخ اصلی وجود داره که وظیفه کنترل برنامه و المانهای گرافیکی و خیلی چیزهای دیگه را داره!
و دقیقا تابع main برنامه محل نخ اصلی برنامه هم هست.

نه ربطی نداره! بحث تامین منابع سخت افزاری نخ ها به عهده سیستم عامل و پردازشگر هست بنابراین استفاده از نخ ها نمیتونه بر روی تامین منابع سخت افزاری نخ های دیگر برنامه ویا نخ اصلی برنامه خللی وارد کنه!
البته در صورتی که در استفاده از نخ ها دچار زیاده روی شوید قطعا در کارایی برنامه تاثیر خواهد گذاشت


خیر دوست عزیز! ربطی به جاوا نداره تمامی محیط های برنامه نویسی همینطور هستند یعنی نرم افزاری که در این زبانها تولید میشه یک نخ اصلی دارند در یک پردازه اصلی
اینکه شما می فرمایید که بایک فعال و غیر فعال کردن متغیر باید انجام میشد؟! تا حالا به غیر از جاوا تو کدوم محیط برنامه نویسی کردید که چنین استنباطی کردید؟ به هرحال حتی محیطهای برنامه نویسی قدیمی هم که single thread apartement بودند هم باز یک نخ اصلی داشتند فقط مشکلی که داشتند این بود که از چند نخی پشتیبانی نمیکردند.
بنابراین وقتی بخواهید با المانهای گرافیکی فرمهایی که دارید در ارتباط باشید باید در همان نخ صاحب المان همون نخ اصلی برنامه در تعامل باشید مثلا برای کاری که شما می خواهید انجام بدید حتما هم لازم نیست که از نخ های دیگه ای استفاده کنید می تونید در همون نخ اصلی هم عملیات هایی که لازم دارید انجام بدید یعنی امکان اضافه کردن عملیاتها ویا فرآیندهایی در زمان اجرا به نخ اصلی وجود دارد. ولی خیلی روش بهینه ای نخواهد بود.
ودر آخر هم همانطور که خودتون گفتید بهتره کمی درباره نخ ها مطالعه داشته باشید و سعی کنید مثالهای مختلف راهم انجام بدید فقط توجه داشته باشید که به علت پیچیدگی هایی که در برنامه نویسی چند نخی و همزمانی و موازی سازی وجود داره سعی کنید که کم کم به این مباحث و تکنیک ها آشنایی پیدا کنید
باز هم متشکرم.
منظورم از نقص کتابخانه‌ها چیز دیگری بود... منظورم این بود که برای اینکه سهولت (حالت خودکار) بیشتری داشته باشیم باید همین‌ها (ایجاد و به‌کارگیری نخ مربوط به به‌روزرسانی مدام textBox ها) به صورت خودکار توسط نرم‌افزارهای برنامه‌نویسی (netbeans) انجام بشود. یعنی من همین‌که در حالت Design از آن بغل (از Pallete) یک عدد Text Area می‌کشم می‌اندازم داخل پنجره‌ام، در اینجا باید خود به خود این موارد توسط netbeans پیشبینی بشود و داخل آن کادر Properties گزینه‌ای وجود داشته باشد (از من سوال شود که) آیا دوست دارم این را به صورت خودکار به‌روزرسانی کنم؟ یا نه؟ اگر دوست دارم در چه بازه‌ای دوست دارم (در زمان اجرای کدام توابع یا زدن کدام دکمه‌ها دوست دارم) همزمان روزرسانی این هم انجام شود؟ اینجا properties را که تغییر می‌دادم خود به خود خودش می‌آمد یک نخ ایجاد می‌کرد (یا می‌گشت نخ پیشین را پیدا می‌کرد) و آن را تنظیم می‌کرد که خود به خود با یک تابع یا یک متغیر یا با یک event به‌روزرسانی شود...
منظورم این بود. البته از سوی دیگر... این حتما به ذهن همه رسیده... و اگر شدنی بود حتما می‌شده...

ان‌شاءالله یک مقدار در مورد نخ‌ها مطالعه کنم باز هم مزاحتمان می‌شوم.
یا علی.

farhad_shiri_ex
پنج شنبه 16 اسفند 1397, 10:52 صبح
باز هم متشکرم.

خواهش میکنم دوست گرامی



منظورم از نقص کتابخانه‌ها چیز دیگری بود... منظورم این بود که برای اینکه سهولت (حالت خودکار) بیشتری داشته باشیم باید همین‌ها (ایجاد و به‌کارگیری نخ مربوط به به‌روزرسانی مدام textBox ها) به صورت خودکار توسط نرم‌افزارهای برنامه‌نویسی (netbeans) انجام بشود

دوست گرامی netbeans فقط یک محیط توسعه هست ارتباطی به نحوه پیاده سازی کدها نداره و نخواهد داشت.



یعنی من همین‌که در حالت Design از آن بغل (از Pallete) یک عدد Text Area می‌کشم می‌اندازم داخل پنجره‌ام، در اینجا باید خود به خود این موارد توسط netbeans پیشبینی بشود و داخل آن کادر Properties گزینه‌ای وجود داشته باشد (از من سوال شود که) آیا دوست دارم این را به صورت خودکار به‌روزرسانی کنم؟ یا نه؟ اگر دوست دارم در چه بازه‌ای دوست دارم (در زمان اجرای کدام توابع یا زدن کدام دکمه‌ها دوست دارم) همزمان روزرسانی این هم انجام شود؟ اینجا properties را که تغییر می‌دادم خود به خود خودش می‌آمد یک نخ ایجاد می‌کرد (یا می‌گشت نخ پیشین را پیدا می‌کرد) و آن را تنظیم می‌کرد که خود به خود با یک تابع یا یک متغیر یا با یک event به‌روزرسانی شود...

دوست گرامی به علت اینکه اگر بخوام توضیح بدم که چرا چنین چیزی تعبیه نشده باید خیلی بحث را فنی توضیح داد و البته توضیح این موضوع هم قطعا در چند سطر شدنی نیست به همین علت پیشنهاد میکنم برای اینکه بهتره متوجه برخی مسائل حوزه طراحی رابط گرافیکی شی گرا Object Oriented Design به اختصار OOD شوید حتما منابع مختلف زبانهای برنامه نویسی مختلف را مطالعه کنید خیلی از این مشکلات براتون رفع خواهد شد.