سلام
ّبه این عکس یه نگاه بندازید ببینین این چه مشکلی داره
کد:برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید![]()
سلام
ّبه این عکس یه نگاه بندازید ببینین این چه مشکلی داره
کد:برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید![]()
سلام
احتمالاً خطایی در کدهای خود design فرم دارید که VS خط دقیق مربوطه را نشانم نمیدهد.
با توجه به اینکه (من وقت نداشتم) از تاپیکتان هم یک هفته ای گذشته، آیا همچنان مشکلتان وجود دارد یا حل شد؟
اگر وجود دارد، در همینجا اطلاع دهید تا مشکل را با هم پیگیری و انشاا... رفع کنیم.
موفق باشید.
سلام
آقا دمت گرم من هر روز سر میزدم تازه میخواستم پ.خ بهتون بدم![]()
این Exception کمر منو شکسته
من هر موقع از کنترل BackgroundWorker استفاده میکنم ای خطا رخ میده برنامه من یک google,URL رو میگیره (یعنی اونURL یه Search,URL است ) و از داخل source اون لیست سایت های پیدا شده توسط گوگل رو در میاره بعدش برای تک تک اون سایت ها باز source اونارو میکیره و داخل Source g اونا دنبال یه عبارت خاص میگرده و فقط روی URL های خاصی این اتفاق رخ میده
برنامه تا آخر درست کار میکنه یعنی میدونم تا آخرین ساتو چک میکنه فقط برنامه وقتی میخواد خاتمه پیدا کنه Exception بر میگردونه
من از VS 2010 استفاده میکنم وگرنه براتون برنامه رو میفرستادم
سلام
همش Exception یک Exception دیگه
شما میتونی برنامه های نوشته شده با VS 2010 رو اجرا کنی و کدشو ببینی اگه میتونی من برنامه رو برای شما پ.خ کنم دو تا URL هم بهتون بدم اجرا کنید Exception هاشو ببنید لطف کنید ببینید کجاش ........ و به من Noob یه توضیح بدید
البته میدونم وقت ......
![]()
سلام
خوب عزیز دل بابا! چرا خودتان و ملت را سر کار میگذاریدمن هر موقع از کنترل BackgroundWorker استفاده میکنم ای خطا رخ میدهزودتر میگفتی!
( آقا شوخی کردم ها بعداً نگید چه ادم خشنیه!)
مسئله چند ریسمانی اگر درست انجام نشود میتواند منشاء خطاهای به ظاهر عجیب و بیموقع باشد.
انشاا... از کنترلر WebBrowse که استفاده نکردید؟ (چون نیازی نبوده)
احتمالاً در روال ریسمان جدیدتان به کنترلری روی فرم ارجاع داده اید؟ یعنی مثلاً Text یا BackColor کنترلری روی فرم را خوانده یا عوض کرده باشید؟
گرچه مجدد در چند روز گذشته نسخه جدید از VS2010 به نام Visual Studio 2010 Ultimate RC عرضه شده معمولا تا نسخه Full چیزی نیاید، نصبش نمیکنم.شما میتونی برنامه های نوشته شده با VS 2010 رو اجرا کنی و کدشو ببینی
اما گمانم بتوانم پروزه را یکجوری باز کنم.
سعی کنید تا جایی که میتوانید پروزه کوچک و ساده تری باشد و اصل قسمت مشکل دار را بفرستید.
=====
بحرحال بدون شک ایراد از تابع Main شما نیست و با این سه خط کد نمیتوان ایراد واقعی را تشخیص داد.
کدهای ریسمان مجزا شما در BackgroundWorker حداقل باید باشد و چک شود.
موفق باشید.
خدا رو شکر که استفاده نکردم (چون یه فکرایی داشتمانشاا... از کنترلر WebBrowse که استفاده نکردید؟ (چون نیازی نبوده))
با این حرفت روحم شاد شدمسئله چند ریسمانی اگر درست انجام نشود میتواند منشاء خطاهای به ظاهر عجیب و بیموقع باشد![]()
برنامه رو پ.خ میکنم اونجا میگم چرا ولی شما لطف کن جوابو اینجا بزار تا یکی دیگه مثل من اینجوری نشه ( چشمام دیگه باز نمیشه از بس search کردم )
ممنون
سلام
کدتان را دانلود کردم
همانطور که حدس زده بودم، شما استفاده صحیحی از مباحث چند ریسمانی ندارید...
من که کلاً گیج شدم که چرا به این شیوه عجیب کار کردید.
اصل ریسمان مجزا یک backgroundworker رویداد DoWork است که شما فقط بخش دانلود را در این رویداد انجام داده بودید و کل حلقه های پردازش شما در رویداد RunWorkerCompleted بود که همان ریسمان اصلی برنامه است و برای همین هم دوباره فرم هنگ میکرده و DoEvents استفاده کرده اید و باز ناچار و مجبور شده بودید backgroundworker دوم را اضافه کنید تا برنامه تان در RunWorkerCompleted هنگ نکند!!!!
بعد هم دوباره مجبور شدید برای سینک کارها آن حلقه عجیب و کمی شگفت انگیز (!!) داخل متد bug_finder را قرار دهید و باز از DoEvents هم برای هنگ نکردن فرم استفاده کنید !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
آخه برادر! اینکه چند ریسمانی نمیشود که شما کد را با همان ریسمان اصلی در RunWorkerCompleted اجرا کنید و باز مثل برنامه های غیر چند ریسمانی برای هنگ نکردن فرم DoEvents اضافه کنید.
اصلاً برنامه چند ریسمانی تقریباً نیازی به DoEvents ندارد!
خوب چه کاریه؟!
کافی است همه کارهایتان تحت DoWork اولی انجام شود!
=====
از طرف دیگر متغیرهایی که خیلی راحت میتوانست آرگومان ورودی توابع باشد را در سطح کلاس ذخیره کرده اید؟؟؟!
=====
چند شرط هم اصلاً کلاً به نظرم زیادی هستند یا مشکل داشتند!
مثلاً
خوب یک رشته که با href شروع شود حتماً برابر "# نیست!!!کد:برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
شرط دوم زائد است.
یا
خوب این شرط که همواره برقرار است!!!!کد:برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
یک مسئله ساده شی گرایی است!
شی objListView که تازه new شده (و بازتعریف اپراتور تساوی ندارد) چطور امکان دارد با اشایی که قبلاً new شده یک اشاره گر داشته باشد!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
اگر میخواستید چک کنید متن تکراری نباشد حداقل باید این کد را مینوشتید:
=====کد:برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
بحرحال کد شما را به روش منطقی و اصولی ویرایش کردم و محل قطعات کد شما را جابجا کرد تا اعمال در همان DoWork و با یک backgroundworker انجام شود.
بعد از این اصلاحات کوچک کد دیگر خطا نداد.
نمیدانم دقیقاً خطا مربوط به کدام یک از ابتکارات جالب شما در چند ریسمانی میشد!ولی بحرحال با حذف ابتکارات شگفت انگیزتان مشکل رفع شد.
=====
ضمناً روش خواندن HTML و یافتن HRef های شما هم کامل و خوب نیست.
HTML که در و پیکر و قانون ندارد!
خصیصه "href" میتواند چند فاصله تا "=" داشته باشد و خود "=" با رشته ...
میتوان اول و آخر مقدار تک کتیشن باشد یا جفت کتیشن باشد و یا حتی هیچ چیز نباشد!!!!
تازه معلوم نیست href که شما پیدا کرده اید برای یک تگ A باشد؟ شاید در متن معمولی فرد آن را نوشته!
و...
بعد هم متد Split شما برای اطلاعات حجیم خیلی سرعتتان را کاهش میدهد در نهایت هم به دلایل فوق کد مستحکم نخواهد بود و همیشه صحیح کار نمیکند.
من برای خواندن HTML و سایر فرمت های مشابه کلاسی درست کردم که میتوانید نمونه کدش را در پک زیر مشاهده کنید.
support.h02.ir/fwlink/?LinkId=1005415457
ضمن اینکه سیستم کار کلاس فوق و ONE SCAN و FAST FORWARD و READONLY است که این سه شرط باعث سرعت فوق العاده ان میشود و در واقع نوعی Html Parser پرسرعت را تشکیل میدهد که همه حالات HTML با خطاهای رایج HTML را میشناسد و میخواند ...
=====
راستی چرا فقط ورودی گوگل را میخوانید؟؟؟؟؟
نکند بخاطر لینک های نسبی باشد؟؟؟؟؟؟؟؟؟؟
و...
و...
و...
کدتان را یک بار دیگر چک میکنم و انشاا... به زودی آپلود میکنم و در پ.خ لینک میدهم.
=====
موفق باشید.
Last edited by _H2_; 19-02-2010 at 19:00.
سلام
این صرفاً یک پست اموزشی کوتاه برای دوستان در ارتباط با چند ریسمانی و استفاده از کامپونت backgroundworker است.
=====
اول برای درک بهتر مفهوم چند ریسمانی حتماً این تاپیک (مخصوصاً پست 7 و پست 9) را مطالعه کنید:
[ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]
پس از مطالعه دو پست فوق ...
در کد زیر جاهایی که با main thread مشخص شده را ریسمان اصلی برنامه اجرا میکند و new thread ها را ریسمان جدیدی که با backgroundworker.dowork آغاز شده.
متد btnStart_Click را ریسمان اصلی فرم اجرا میکند و متد RunWorkerAsync ریسمان جدیدی را به خدمت میگرد که لحظاتی بعد ریسمان جدید با اجرای دستورات داخل متد backgroundWorker1_DoWork کارش را شروع میکند.کد:برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
هر زمان دستورات داخل backgroundWorker1_DoWork تمام شود ریسمان جدید به کارش خاتمه میدهد و پیامی برای ریسمان اصلی برنامه جهت اجرای backgroundWorker1_RunWorkerCompleted میفرستد.
backgroundWorker1_RunWorkerCompleted توسط ریسمان اصلی خود برنامه اجرا میشود و نباید حاوی پردازش سنگین باشد ...
فقط نتایج کار را چاپ یا نمایش دهد و احیاناً کنترلی که غیر فعال شده بوده را مجدد فعال کند و...
در عوض تا وقتی پردازش داخل backgroundWorker1_DoWork و توابعی که در این متد صدا زده میشود باشد، ریسمان جدید آن را اجرا میکند و فرم هم قفل نمیکند چون ریسمان اصلی آزاد است و فرامین کاربر را روی فرم انجام میدهد.
در این متد هیچ DoEvents هم نیاز نخواهد بود.
=====
دات نت یک مکانیزم عدم تداخل+امنیتی دارد که اجازه دسترسی به کنترلرها فرم را از سایر ریسمان ها نمیدهد.
(((
میتوان این مکانیزم را خاموش کرد ولی پیشنهاد نمیکنم، ضمن اینکه در شرایط خاص باز میتواند مشکل ساز شود، از آن مشکلاتی که افراد غیر آشنا به مکانیزهای داخلی را گیج و دیوانه میکند! پس همینطوری روش باشد بهتر است!
)))
ولی بحرحال ما در متد backgroundWorker1_DoWork یا ریسمان های دیگر گاهاً نیاز به دستکاری کنترلرها مثلاً در جهت نمایش میزان پیشرفت کار داریم.
برای اینکار میتوان از تلفیق خصیصه InvokeRequired و متد BeginInvoke استفاده کرد.
کد فوق اول با if ریسمانی که دستورات را اجرا میکند چک میکند.کد:برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
اگر ریسمان اصلی نباشد شرط برقرار میشود و پیغامی برای ریسمان اصلی گذاشته میشود تا هر وقت فرصت داشت یکبار همین متد (TextReport) با پارامترهالیی که حالا دارد (text) اجرا کند!!! (چه با شخصیت!)
این کار مثل ان میماند که در اداره ای، کاغذ و پرونده ای را برای پیگیری روی میز یک کارمند قرار دهید تا هر وقت کار نداشت و نوبت این پرونده رسید، این را هم بررسی کند و کارش را انجام دهد.
و خودتان بگذارید و بروید به کارتان برسید.
این کار در برنامه نویسی چندین مزیت دارد:
1- مشکل خطای تداخلی/امنیتی Cross (که قبلاً بیان شد) پیش نمی اید و ریسمان جدید مستقیماً چیزی روی فرم را تغییر نمیدهد.
2- اگر ریسمان جدید خودش بخواهد کنترلرهای روی فرم را تغییر و ترسیم کند، طبیعتاً بخشی از وقتش گرفته میشود و جمع زمان عملیاتش طولانی تر میشود.
مثل وقتی که خودتان بروید دنبال کار یک پرونده تا اینکه پرونده را روی میز کارمند مسئول بگذارید تا خودش ان را انجام دهد و شما بروید به ادامه کار خودتان برسید!!!
3- برخی از کنترلرهای خاص که در هسته سیستم عامل مدیریت میشوند اگر از ریسمانی که صف پیغامها را در دست ندارد تغییر رویش اعمال شود، تغییرات را سریع روی مانیتور نشان نمیدهد و عملاً کنترلر آپدیت نمیشود.
در حالیکه با دستور فوق به علت انکه ریسمان اصلی سرش خلوت است فوراً این کار را به بهترین و صحیح ترین نحوش انجام میدهد و ریسمان جدید هم که به ادامه کار پردازشی خودش میرسد.
نتیجتاً هر زمان در کدهایی که از ریسمان جدید اجرا میشود خواستید کنترلرهای روی فرم را تغییر دهد (متن و رنگ و...) با این مکانیزم تلفیقی InvokeRequired و BeginInvoke این کار را انجام دهید.
=====
ضمنا در همچین کدی استفاده از DoEvents جایگاهی ندارد!
هر جا DoEvents را به [B]قصد هنگ نکردن فرم[B] گذاشتید بدانید که دارید با ریسمان اصلی کاری را انجام میدهید نه ریسمان جدید و مجزا .
=====
البته به نظر شخصی من استفاده مستقیم از کلاس System.Threading.Thread ساده تر از System.ComponentModel.BackgroundWorker است.
مایکروسافت خواسته در System.ComponentModel.BackgroundWorker کار چند ریسمانی را برای عموم ساده تر کند ولی به نظر شخصی من چندان تفاوتی نکرده!
و نحوه استفاده خیلی شبیه هم و یکسان است.
=====
مطالب گفته شده عیناً برای VB.Net صادق است و زبان برنامه نویسی فرقی نمیکند.
جمیعاً موفق و شاد باشید.
![]()
Last edited by _H2_; 14-03-2010 at 19:21. دليل: begininvoke
آقا نمیدونم چطور تشکر کنم
این گلا که فایده نداره نمیشه باهش تشکر کرد
کد:برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
بازم ممنون
جناب H2 پست شماره 7 رو که میخوندم ترکیدم
پس از بس گل کاشته بودم شده بود یه باغ زیبادرسته من قبلا باغبون بودم
این کلاسی که شما نوشتید که از کل برنامه من یه Kb 40 که بیشتره (شوخی)
شما Master هستیمن noob احتمالا مدت زیادی برنامه نویسید
من خودم شروع به یا گیری کردم نمخوام توجیه کنم ولی برام سخته یکم
در مورد سوالات :
چون داخل source سایت های وجود داشت که مال google بود ولی دلیل اصلیش این بود که گوگل تنها متور جستجویی که ( الیته شاید باشه و من نمی دونم ) که از داخل URL های سایتها چیز خاصی رو جستجو میکنه
خب کدی که آپلود کردیدو برسی کردم میدونم زمان پست منو خودتونو مقایسه کردی نو فهمیدین چه سریع
چون کد برام سنگین بود و بعضی قسمت های کدو نفهمیدم و اگه اجازه بدید سوالای مبتدیانمو آغازکنم ( اگه اجازه دادیدفقط بگید تاپیک جدید بزنم تا جستجو برای بقیه آسون باشه یا همین جا بپرسم)من مسمم که #C رو یاد بگیرم
Last edited by without_all; 19-02-2010 at 21:04.
هم اکنون 1 کاربر در حال مشاهده این تاپیک میباشد. (0 کاربر عضو شده و 1 مهمان)