PDA

View Full Version : مبتدی: تعويق يك خط از برنامه تا تكميل عمليات خط قبلي



hamed2661
سه شنبه 22 شهریور 1390, 13:17 عصر
با سلام
دوستان سئوال من اينه كه چجوري ميشه اجراي يك خط برنامه رو تا تكميل شدن فرآيند خط قبلي به تعويق انداخت ؟
اصل مساله اينه كه قراره توي يك خط از برنامه فايل فشرده بشه و در خط بعدي فايل سورس حذف بشه ولي در عمل خطوط پشت سر هم اجرا ميشن و قبل از اينكه تو خط يك برنامه كارش تموم شده باشه خط دوم فايل سورس رو حذف ميكنه. سورس برنامم اينه:


zipcmd = "c:\bk\rar.exe a c:\bk\B.rar B.mdb"
Shell(zipcmd, AppWinStyle.NormalFocus)
Kill("c:\bk\" & strfile & ".mdb")
Label1.Text = "تهيه نسخه پشتيبان انجام شد"

bia2joker
سه شنبه 22 شهریور 1390, 13:27 عصر
اساس برنامه، روند خط به خط هستش و تا خطی انجام نشه به خط بعد نمیره
ولی برای این موضوع شاید استفاده از توابع تاخیر بتونه کمکت کنه

hamed2661
سه شنبه 22 شهریور 1390, 13:37 عصر
درسته ولي فكر كنم تو اين شرايط دات نت همين كه دستور خارجي Rar.exe رو ديد تو حافظه مقيم شده ديگه كاري به اتمام كارش نداره ول ميكنه بر ميگرده و خط بعدي رو اجرا ميكنه. توابع تاخيري هم چون نميدونم كار rar.exe چقدر طول ميكشه به نظر نميرسه كاربردي داشته باشن فكر كنم بايد از threading استفاده كنم چجوري نميدونم

hamed2661
سه شنبه 22 شهریور 1390, 14:05 عصر
با دستور System.Threading.Thread.Sleep(n) ميشه وقفه ايجاد كرد اما اگر مقدار n كم باشه ارور ميده كه فايل درحال استفاده است اگر زياد باشه كاربر الكي معطل ميشه

bia2joker
سه شنبه 22 شهریور 1390, 14:30 عصر
این لینک مقاله چند ترد هستش که شاید کمکت کنه
http://barnamenevis.org/showthread.php?191909-MultiThreading-چیست؟

منم خودم از ترد ها سر در نمی یارم!!!!

hamed2661
سه شنبه 22 شهریور 1390, 14:36 عصر
ممنون دوست عزيز يه مروري كردم اما من اشتباه فكرميكردم به نظر ميرسه threading واسه مديريت فعاليتهاي موازي توي يك برنامه است. در حالكيه من ميخوام موازي نشه ! يه جورايي مثل برنامه هاي تك وظيفه اي و اسپاگتي تحت داس بشه و تا فشرده سازي تموم نشده فايل سورس حذف نشه.

Behzad_MCP
سه شنبه 22 شهریور 1390, 14:53 عصر
دوست عزیز برای اینکار باید از Asynchronous Programming Model استفاده کنید دربارش جستجو کنید و تحقیق من یک مثال در زیر گذاشتم تا بیشتر آشنا بشید

Dim buffer() As Byte = New Byte(100) {}
Dim filename as String = _
String.Concat(Environment.SystemDirectory, "\\mfc71.pdb")
Dim (file://\\mfc71.pdb")Dim) strm as FileStream = New FileStream(filename, _
FileMode.Open, FileAccess.Read, FileShare.Read, 1024, _
FileOptions.Asynchronous)
' Make the asynchronous call
Dim result As IAsyncResult = _
strm.BeginRead(buffer, 0, buffer.Length, Nothing, Nothing)
' Do some work here while you wait
' Calling EndRead will block until the Async work is complete
Dim numBytes As Integer = strm.EndRead(result)
' Don't forget to close the stream
strm.Close()

hamed2661
سه شنبه 22 شهریور 1390, 15:18 عصر
بهزاد جان مطمئني در مورد سئواليه كه پرسيدم؟

mehdi.mousavi
سه شنبه 22 شهریور 1390, 15:42 عصر
سلام.
می تونید بدین شکل عمل کنید:

Dim p As System.Diagnostics.Process = System.Diagnostics.Process.Start("NotePad.exe")
p.WaitForExit()

تا وقتی NotePad بسته نشه، اجرا در خط WaitForExit متوقف می مونه.

موفق باشید.

پاورقی: برای ارسال پارامترها به rar.exe از دیگر Overload های Start استفاده کنید. توضیحات بیشتر رو در MSDN مشاهده کنید.

Behzad_MCP
سه شنبه 22 شهریور 1390, 17:18 عصر
بهزاد جان مطمئني در مورد سئواليه كه پرسيدم؟

بله دوست عزیز ، شما میخواهید تا یک عملی به پایان نرسیده عمل بعدی آغاز نشه پس شروع عمل بعدی مشروط به پایان عمل قبلی است پس شما به یک متغیر نیاز دارید که پایان عمل قبلی را مشخص کنه تو مثالی که زده بودم متغیر result که از نوع IAsyncResult بود تا زمانی که Read به آخر نرسه EndRead رو بلوک میکنه