مشاهده نسخه کامل
: جستجوي تمام هارد ديسك در عرض يك يا چند ثانيه با وي بي 2005!!! (لطفآ كمكم كنيد)
با سلام آيا كسي اينجا ميدونه كه چطوري ميتونم چندين هزار آيتم را در عرض يك يا چند ثانيه در ListView قرار بدم.
براي مثال من ميخوام يك برنامه بنويسم كه تمام هارد ديسك را در عرض چند ثانيه جستجو كنه مثل همين نرم افزار تربو سرچر Turbo Searcher. من تمام كارهاي ديگر را از قبيل ايندكس كردن يا همان جمع آوري تمامي نام فايلهاي هارد ديسك در يك فايل رو انجام دادم و فقط تنها مشكلي كه مانده اين هست كه چطور ميتونم چندين هزار نام فايل رو در عرض يك يا چند ثانيه در ListView قرار بدم. من در ابتدا گرفتم تمامي نام فايلها رو در يك فايل تكستي يا متني جمع آوري كردم كه حدودآ چندين هزار تا خط ميشن بعد با خودم فكر كردم كه بگيرم از يك عبارت For...Next استفاده كنم كه هر خطي رو دونه به دونه در ليست اضافه كنه ولي متوجه شدم كه اينطوري حدود 3 الي 5 دقيقه طول ميكشه كه نام تمام فايلها در ليست قرار داده بشوند. لطفآ و خواهشآ اگر ممكنه يكي كمكم كنه!!! :sad:
mohseni12345
01-10-2006, 22:48
شما اول اون فایل متنی که داری رو در اول برنامت بخون و بزار توی یه متغیر بعد توی متغیر سرچ کن
این که خط به خط از روی فایل می خونی خیلی سرعتو میاره پایین
منم دارم یه برنامه درست می کنم که کار ویندوز اکسپلورر رو انجام بده
مثلا مشاهده ی فایل ها پاک کردن یا کپی کردن
منم از همین روش استفاده کردم
سلام آقاي mohseni12345
خيلي ممنون كه جواب داديد. من هم در ابتدا ميخواستم كاري مثل كار شما يعني ساخت ويندوز ايكسپلورر را انجام بدم ولي ديدم از اين كار خوشم نمياد و مورد پسند من نبود.
راستي اين كاري كه شما گفتي رو همون اول انجام دادم ولي بازهم همون چند دقيقه طول ميكشه تا در ليست اضافه بشوند. من اين كار رو كردم اگر منظور شما اين نبود خواهش ميكنم كه بيشتر توضيح بديد:
من در ابتدا فايل رو در يك متغير از نوع رشته جا سازي كردم
بعد يك متغير از نوع رشته خالي ساختم
بعد از يك عمل For Each...Next استفاده كردم
ولي باز هم همون 2 الي 3 دقيقه طول ميكشه!!
لطفآ آقاي mohseni12345 و همچنين هر كس ديگه اي كه داره اين مطلب رو ميخونه و ميتونه كمكم كنه نظرش رو بنويسه.
ممنون...خدايا به اميد تو.
سلام.
شما بايد همزمان كه فايلي رو پيدا ميكنيد در ListView قرار بديد.
به اين نوع برنامه ها MultiTasking گفته ميشه.بايد از دو Thread در برنامتون استفاده كنيد.
يكي براي Serach و ديگري براي قرار دادن اسامي در ListView .
در ضمن چون منابع بين دو Thread مشترك هستند بايد از Mutex يا CriticalSection استفاده كنيد
تا بتونيد از يك منبع استفاده كنيد.
با تشكر از شما آقاي Someone
اگر ميشه يكم بيشتر در مورد Thread ها توضيح بديد راستش رو بخواين من اين موضوع thread ها برام شده مشكل چون اصلا ازش سر در نمي آرم. ممنون ميشم اگر توضيح بيشتري بديد.
دوباره سلام.
حتما تا حالا برنامه هايي رو ديديد كه همزمان چند كار باهم انجام ميدن.
مثل MSWord كه هنگامي كه شما در حال تايپ كردن هستيد همزمان غلط هاي املايي شما چك ميشه.
و يا بزرگترين مثالش كه خود Windows هست .شما ميتونيد همزمان هم رايت كنيد و هم موسيقي گوش كنيد وغيره.به اين اجراي همزمان multi-treading گفته ميشه. اصطلاحا بهش ريسمان هم گفته ميشه.
خيلي ساده تر در مورد برنامه ي شماست. شما دو حلقه( Loop ) داريد كه همزمان با هم كار ميكنند.
در حالت عادي بايد اولين حلقه اجرا بشه و بعد حلقه ي بعد.ولي وقتي شما از اين حلقه ها در دو Thread
جداگانه استفاده ميكنيد OS كنترل حلقه ها رو بدست ميگيره و اجازه ميده كه دو حلقه همزمان با هم كار كنند.
بدون اينكه مشكلي پيش بياد.ولي اگه منبعي بين اين دو Thread مشترك باشند زمان بندي دسترسي به
اين منبع (كه در برنامه ي شما يك Buffer هست ) رو بايدخودتون كنترل كنيد.اين كار با استفاده از Mutex انجام ميشه.
كه در زمان مورد نظر ميتونه منبع رو Lock يا UnLock كنه. اينها از مباحث پيشرفته ي برنامه نويسي هستند.
متاسفانه من با VB آشنا نيستم و با ++C و VC و #C كار ميكنم.
خود Thread Function به اين صورت تعريف ميشه البته در ++C كه يه تابع static هست كه يك آرگومان از
نوع LPVOID داره.
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
براي راه اندازي و متوقف كردن در VC از AfxBeginThread استفاده ميشه.ولي شما ميتونيد از اين
API ها استفاده كنيد:
CreateThread
ResumeThread
SuspendThread
ExitThread
ولي بدنه ي اصلي تابع Thread كه به اون ThreadProc هم گفته ميشه به شكل بالا تعريف ميشه.
سعي كردم خلاصه و مفيد توضيح بدم.
ميتونيد در باره يWorker Thread مطالب زيادي پيدا كنيد.
اگه مشكلي پيش اومد اطلاع بديد.
ممنون.
با سلام دوباره
آقا Someone خيلي ممنون و دستتون درد نكنه به خاطر توضيحاتتون. ولي باز هم همان مشكل اول وجود دارد
مشكل اينجاست كه زماني كه از Thread ها استفاده ميكنيم تنها فرقي كه دارد اين است كه برنامه هنگ يا به قول خودماني قفل نميكند. تا قبل از آن اگر از Thread ها استفاده نكنيم برنامه در همان زماني مشغول اضافه كردن نام فايلها در ليست ميباشد هنگ ميكند و بعد از آن دوباره به حالت عادي بازگشته و ليست را نشان ميدهد ولي هنگامي كه از thread ها استفاده ميكنيم برنامه به جاي اينكه به مدت دو الي سه دقيقه هنگ كند حالت عادي خود را در پيش ميگيرد و نام فايلها را در ليست اضافه ميكند و اين هم همان دو الي سه دقيقه طول ميكشه تا تمام نام ها در ليست قرار بگيرند... يعني باز هم برگشتيم به همان خانه اول!
تنها چيزي كه معلوم است اين هست كه زماني كه از حلقه ها براي اضافه كردن در ليست استفاده ميكنيم اين مشكل پيش مي آيد در حالت عادي اگر ما بدون استفاده از حلقه ده هزار خط را در يك تكست باكس بريزيم خيلي سريعتر خواهد تا اينكه بخواهيم به صورت خط به خط و هر خط را به عنوان يك آيتم در ليست قرار دهيم.
يك موضوع ديگر نيز مي ماند و ان اينكه در ListView خاصيتي به نام Addrange دارد كه به ظاهر ميتواند يك محدوده از اطلاعات را در ليست قرار دهد ولي من نميدونم چطوري ميشه همين كاري رو كه من ميخواهم انجام بدم رو با اين خاصيت انجام بدم تا ديگه نيازي به استفاده از For Each..Next نباشه. خيلي ممنون.
mohseni12345
05-10-2006, 18:07
باز هم همان مشكل اول وجود دارد
مشكل اينجاست كه زماني كه از Thread ها استفاده ميكنيم تنها فرقي كه دارد اين است كه برنامه هنگ يا به قول خودماني قفل نميكند. تا قبل از آن اگر از Thread ها استفاده نكنيم برنامه در همان زماني مشغول اضافه كردن نام فايلها در ليست ميباشد هنگ ميكند و بعد از آن دوباره به حالت عادي بازگشته و ليست را نشان ميدهد ولي هنگامي كه از thread ها استفاده ميكنيم برنامه به جاي اينكه به مدت دو الي سه دقيقه هنگ كند حالت عادي خود را در پيش ميگيرد و نام فايلها را در ليست اضافه ميكند و اين هم همان دو الي سه دقيقه طول ميكشه تا تمام نام ها در ليست قرار بگيرند... يعني باز هم برگشتيم به همان خانه اول.
در حالت معمولی اگه خواستی کامپیترت هنگ نکنه باید از دستور DoEvents استفاده کنی
کار این دستور اینه که به ویندوز میگه وقتی یه دستور رو به طور کامل انجام دادی بعد برو سراغ دستور بعدی
این کار از هنگ کردن کامپیوتر جلوگیری می کنه
سورس نميذاريد؟
يك جستجو كننده با قابليت ادامه جستجو ميخام
anvar.net
19-06-2007, 09:36
يك جستجو كننده با قابليت ادامه جستجو ميخام
یعنی چی؟
منظورت اینه که با تایپ حروف لغاتی که حروف مورد نظر را در اول خود دارند انتخاب بشوند یا نه؟
سلام
حتماً از چند ریسمانی استفاده کنید و راحتترین راه هم کامپونت BackgroundWorker است که در تولبار وجود دارد. و خیلی هم ساده است! با دستور RunWorkerAsync ریسمان دوم شروع میشود و میتوانید در رویداد DoWork کار مورد نظر را تایپ کنید.
با سلام
اول از همه اينو بگم كه نميخام تو برنامه دكمه يا چيزه ديگه اي باشه تا كاربر كليك كنه يعني بعد از كليك روي فايل
اجرايي شروع به جستجو كنه ودر آخر هم نتيجه را هم تو يك txt. ذخيره كنه
anvar.net عزيز منظورم اين بود:
فرض كنيد هنگامي كه برنامه در حال جستجو هست به هر دليلي قطع بشه مثلا با Restart يا Log of يا Turn off
شدن كامپيوتر .
بعد از بالا اومدن ويندوز از همون جايي كه قطع شده بود ادامه بده مثلا ادامه كارو از يك txt. ديگه بخونه
طبعا بايد تو استارت آپ باشه ولي فعلا ادامه جستجو برام مهمتره . براي استارت اپ كار ديگه اي هم ميشه كرد.
راستي دوستان مي شه سورس بذاريد ؟ لطفا :20:
ممنون anvar.net و _H2_ عزيز
:11:
سلام
اگر یک لیست از فایلها میخواهید این کار با قدرت VB8 میشود یک خط!
برای این کار در VB8 کدی یک خطی کافیست!!!! بازم برید بگید VB8 بد جاییه! قدرت را حال کنید!
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
سریعتر از این کد یک خطی چیزی پیدا نمیکنید! اما فقط لیست میده و مشخصات نداره.
فرض كنيد هنگامي كه برنامه در حال جستجو هست به هر دليلي قطع بشه مثلا با Restart يا Log of يا Turn off
شدن كامپيوتر .
بعد از بالا اومدن ويندوز از همون جايي كه قطع شده بود ادامه بده مثلا ادامه كارو از يك txt. ديگه بخونه
بیخیال!
موفق باشید.!
اگه دقيقا اون چيزي كه ميخاستم پيدا كردي با سورسش برام بذار
.....در ضمن بخاطر راهنمايي ممنونم ......
:46:
Shahrdar
22-06-2007, 10:16
سلام دوست عزیز
من فقط میخواستم یه نکته رو بگم .....
سرعت listbox از listview حداقل 3 بار بیشتره اگه میتونی از این مسئله استفاده کن
سلام
اگه دقيقا اون چيزي كه ميخاستم پيدا كردي با سورسش برام بذار
.....در ضمن بخاطر راهنمايي ممنونم ......
:46:
نمیدانم، منظورتان با من بود؟؟؟؟؟؟؟؟؟؟؟؟؟؟!!!!!!!!!!!!! :13:
اگر اینطور است باید بگویم من فقط کدی را دادم که میتواند در یک تک خط واحد نام تمام فایلهای داخل یک دایرکتوری را به String تبدیل کند که میشود آن را رد TextBox ریخت و یا در یک فایل، همین، کدش هم همان است که نوشتم و چیز دیگری ندارد.
اگر ListBox یا ListView میخواهید باید در یک حلقه For Each نتیجه System.IO.Directory.GetFiles را اسکن کنید و به کنترلر اضافه کنید که کلاً میشود سه خط کد و امیدوارم برای سه خط کد ناقابل سورس نخواهید! :31:
vBulletin , Copyright ©2000-2025, Jelsoft Enterprises Ltd.