PDA

View Full Version : سوال: نگه داشتن زمان (وقفه) تا چند لحظه و سپس اجرای دستورات بعد



R2du-soft
چهارشنبه 21 تیر 1391, 21:50 عصر
سلام
کد یا روشی میخوام که چند لحظه برای اجرای دستورات بعدیم زمان بخره!!!!

یه مثال میزنم تا بهتر گفته باشم

مثلا در پوشه c:\windows تعداد 200 فایل dll وجود داره

من با دستور کپی گفتم که این فایلهای dll رو کپی کنه توی یه شاخه ... (مثلا d:\1 )
حالا گفتم که فایل dll که امسش zz.dll هست رو از مسیر d:\1 پاک کنه

چون فایل zz.dll آخرین فایلی هست که در مسیر d:\1 کپی میشه و هنوز کپی نشده دستور پاک کردنم اجرا میشه درصورتی که فایلم هنوز کپی نشده که بخوا پاک بشه

میخوام کاری کنم که تا دستور کپی dll هام تموم نشده دستور پاک کردنم اجرا نشه
میشه چنین کاری کرد؟
یا اگه بشه بین دستور کپی و پاک کردن یه وقفه ایجاد بشه که اول فایلهام کپی و سپس پاک بشه


(توی دستور کپی فایلم میتونم بگم که همه فایلهای dll بجز reza.dll و zz.dll کپی بشه؟ )

بهروز عباسی
چهارشنبه 21 تیر 1391, 21:55 عصر
درود
برای ایجاد وقفه باید از تابع Sleep استفاده کنی
اما برای کار شما بهتره :
- اول از موجود بودن اون فایل اطمینان حاصل کنی بعد پاکش کنی.

موفق باشید.

بهروز عباسی
چهارشنبه 21 تیر 1391, 21:58 عصر
این لیــــــــــنک برای ایجاد وقفه (http://www.vbforums.com/showthread.php?t=442519)
و ایـــــــــــــن هم برای چک کردن وجود فایل (http://www.vbforums.com/showthread.php?t=349990).

موفق باشید

mohammadriano
چهارشنبه 21 تیر 1391, 22:15 عصر
خب این تابع هم می تونه کمکتون کنه

Public Sub SleepFor(ByVal Seconds As Double)
' "Sleep" for the specified number of seconds.
Dim EndTime As Date
EndTime = DateAdd("s", Seconds, Now)
Do
DoEvents
Loop Until Now >= EndTime
End Sub

در ضمن تا اون جایی که من اطلاع دارم تا دستور پاک یا کپی شدن فایل تا اتمام کپی شدن فایل انجام نشه خط بعدی دستور اجرا نمیشه

R2du-soft
پنج شنبه 22 تیر 1391, 13:04 عصر
مرسی از دوستان بابت راهنمایی ها
من هرکاری کردن نتونستم از کدها در برنامم استفاده کنم چون موقعی که از این کدها استفاده میکنم به دستور



Set WshShell = CreateObject("WScript.Shell")

که توی برناممه گیر میده

کوچکترین کد و راحت ترین کد برای وقفه 10 ثانیه ای و برای بین کدهام میخوام

مثلا


Shell "xcopy """ & c:\windows\system32\*.dll"" """ & d:\1\ & """ /i /r /y"

وقفه 10 تانیه ای


kill "d:\1\zz.dll"
kill "d:\1\yy.dll"


مرسی از همه دوستان که منو راهنمایی میکنن

محسن واژدی
پنج شنبه 22 تیر 1391, 14:05 عصر
سلام علیکم
اگر صرفا میخواهید وقفه ای مابین Shell و ادامه برنامه اتفاق بیافتد میتوانید از Sleep استفاده کنید (همانطور که آقای عباسی هم اشاره کردند):


Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private Sub Command1_Click()
Shell "xcopy c:\windows\system32\*.dll d:\1\ /i /r /y"

Sleep 10000 '10s

Kill "d:\1\zz.dll"
Kill "d:\1\yy.dll"
End Sub
در Sleep تا قبل از سپری شدن زمان 10s برنامه موقتا متوقف خواهد بود

اما اگر بخواهیم تا سپری شدن 10s برنامه به رویدادها پاسخگو باشد میتوانید از کد زیر استفاده کنید (همانگونه که آقای mohammadriano هم اشاره نمودند)(البته موقتا رم تا اتمام وقفه مشغول میشود ولی متقابلا" برنامه نسبت به رویدادها واکنش میدهد):
ابتدا روال زیر را در ماژول کد یا فرم کپی کنید


Public Sub SleepX(ByVal sSeconds%)
Dim lNowTime&
lNowTime& = Abs(Timer)
Do
If Abs(Timer) <> lNowTime& Then lNowTime& = Abs(Timer): sSeconds% = sSeconds% - 1
DoEvents
Loop Until sSeconds% <= 0
End Sub
برای مثال:


Private Sub Command1_Click()
Shell "xcopy c:\windows\system32\*.dll d:\1\ /i /r /y"
SleepX 10
Kill "d:\1\zz.dll"
Kill "d:\1\yy.dll"
End Sub
و یا اگه وقفه مابین برنامه را صرفا برای این منظور می خواهید که از پایان یافتن عملیات کپی توسط (xcopy) اطمینان حاصل کنید، میتوانید از تابع Run کامپوننت "Windows Script Host Object Model" استفاده کنید که تا اتمام برنامه xcopy نه رم مشغول میشود و برنامه هم روال عادی را تا اتمام عملیات xcopy طی می کند، برای جلوگیری از انجام هم عمل دیگر توسط کاربر هم میتوانید فرم برنامه را Disable کنید:


Private Sub Command1_Click()
Dim WshShell As Object

Set WshShell = CreateObject("WScript.Shell")

Me.Enabled = False'
WshShell.Run "xcopy c:\windows\system32\*.dll d:\1\ /i /r /y", , True
Me.Enabled = True'

Kill "d:\1\zz.dll"
Kill "d:\1\yy.dll"
End Sub
موفق باشید

R2du-soft
پنج شنبه 22 تیر 1391, 14:26 عصر
هنگام استفاده از دستور





Private Sub Command1_Click() Dim WshShell As Object Set WshShell = CreateObject("WScript.Shell") Me.Enabled = False' WshShell.Run "xcopy c:\windows\system32\*.dll d:\1\ /i /r /y", , True Me.Enabled = True' Kill "d:\1\zz.dll" Kill "d:\1\yy.dll" End Sub



صفحه داس نمایان میشود و عملیات دستوری که در برنامه هست دیده میشوند

من کد رو به کد زیر تغییر دادم تا صفحه داس minimize شود





Private Sub Command1_Click()
Dim WshShell As Object

Set WshShell = CreateObject("WScript.Shell")

Me.Enabled = False'
WshShell.Run "xcopy c:\windows\system32\*.dll d:\1\ /i /r /y", vbMinimizedNoFocus, True
Me.Enabled = True'

Kill "d:\1\zz.dll"
Kill "d:\1\yy.dll"
End Sub



ولی میخوام که بجز minimize شدن hide هم بشه!!
چطوری میتونم هم minimize و هم hide کنم؟
مرسی

R2du-soft
پنج شنبه 22 تیر 1391, 21:37 عصر
:افسرده::گریه:
دوستان کسی نیست جواب بده؟! :ناراحت:

سید حمید حق پرست
جمعه 23 تیر 1391, 02:27 صبح
سلام علیکم
الان شما چه مشکلی دارید بگید تا اگر بتونیم حل کنم

موفق باشید


یا علی (ع)

R2du-soft
جمعه 23 تیر 1391, 02:54 صبح
کدی مخوام که دستور



WshShell.Run "xcopy c:\windows\system32\*.dll d:\1\ /i /r /y", True


را به صورت مینیمایز و مخفی نشون بده

و

کدی دیگه میخوام که مسیری که در متغیر Text1.Text هست رو برام بازکنه
مثلا مسیر c:\windows هست توی Text1.Text که میخوام باز بشه در صفحه مای کامپیوتر
با دستور shell آزمایش کردم ولی نتیجه نگرفتم!!

مرسی عزیز

just4froum
جمعه 23 تیر 1391, 04:00 صبح
برای hide شدن به جای vbMinimizedNoFocus در کد خودتون از vbHide استفاده کنید.

just4froum
جمعه 23 تیر 1391, 04:09 صبح
کدی دیگه میخوام که مسیری که در متغیر Text1.Text هست رو برام بازکنه
مثلا مسیر c:\windows هست توی Text1.Text که میخوام باز بشه در صفحه مای کامپیوتر
با دستور shell آزمایش کردم ولی نتیجه نگرفتم!!

مرسی عزیز

Shell "explorer C:\windows", vbNormalFocus
'Or
Shell "explorer " & Chr(34) & Text1.Text & Chr(34), vbNormalFocus

R2du-soft
جمعه 23 تیر 1391, 09:39 صبح
برای hide شدن به جای vbMinimizedNoFocus در کد خودتون از vbHide استفاده کنید.

نمیشه در کد از 2 دستور ,vbminimized و ,vbhide استفاده کرد؟

میخوام بعد از دستور ,vbminimized دستور vbhide و سپس دستور , True که در کد زیر هست رو قرار بدم ولی چون 3این 3 تا کد رو پشت سر هم مینویسم ارور میده. ولی 2 تارو قبول میکنه.
چطور میتونم از 3 تا دستور استفاده کنم طوری که برنامم ارور نده؟
مرسی






Private Sub Command1_Click() Dim WshShell As Object Set WshShell = CreateObject("WScript.Shell") Me.Enabled = False' WshShell.Run "xcopy c:\windows\system32\*.dll d:\1\ /i /r /y", vbMinimizedNoFocus, True Me.Enabled = True' Kill "d:\1\zz.dll" Kill "d:\1\yy.dll" End Sub

R2du-soft
جمعه 23 تیر 1391, 11:01 صبح
بالاخره خودم فهمیدم !!!! هورا
میزارم تا دوستان استفاده کنن









vbHide = 0
vbNormalFocus = 1
vbMinimizedFocus =2
vbMaximizedFocus = 3
vbNormalNoFocus = 4
vbMinimizedNoFocus = 6


به جای کد ها از مقدارشون هم میتونیم استفاده کنیم








Private Sub Command1_Click()
Dim WshShell As Object

Set WshShell = CreateObject("WScript.Shell")

Me.Enabled = False'
WshShell.Run "xcopy c:\windows\system32\*.dll d:\1\ /i /r /y", 6 & 0, True
Me.Enabled = True'

Kill "d:\1\zz.dll"
Kill "d:\1\yy.dll"
End Sub

محسن واژدی
جمعه 23 تیر 1391, 14:42 عصر
WshShell.Run "xcopy c:\windows\system32\*.dll d:\1\ /i /r /y", 6 & 0, Trueسلام علیکم
بله اصولات vbHide و نظیر این اعضایی از Enumها هستند که بکارگیری نامشان در کد مربوطه موجب خواناتر شدن کد میشود که در اجرا مقادیر کد جایگزین میشود
برای استفاده از بیشتر از یک مقدار در پارامتر آنها را با "+" و بیشتر با "Or" اضافه میکنم و بر حذف کردن یک مقدار مقادیر آنرا And میکنیم
در کد بالا برای جمع دو مقدار 6 و 0 آنرا بصورت زیر مینویسیم (البته جمع ایندو تاثیری در نتیجه نهایی ندارد):

WshShell.Run "xcopy c:\windows\system32\*.dll d:\1\ /i /r /y", 6 Or 0, True موفق باشید

abolfazl-z
شنبه 24 تیر 1391, 11:45 صبح
سلام دوست عزیز

جواب 1:
برای کپی کردن میتونی از تابع FileCopy استفاده کنی
جواب 2:
برای باز کردن هم میتونییی از کد زیر استفاده کنی:
Shell "explorer c:\windows"
اگر بعد از آدرس یک دانه ویرگول بزاری میتونی نوع نمایش اش را معلوم کنی(یعنی پنهان بشه مینی مایز بشه و...)
مثال:
Shell "explorer c:\windows", vbNormalFocus