الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

تشغيل برنامج مع عدم تنفيذ الكود حتى ينتهي

مغلق
بدأه محمد سامر أبو سلو في 26 نوفمبر 2006 · 17 رد · 1,353 مشاهدة · في لغة Ms Visual Basic 6 وما قبلها من إصدارات
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

أقوم بعمل برنامج ينفذ برنامج خارجي ولكن لاأريد أن يتم تنفيذ الكود الذي يلي أمر تشغيل البرنامج الخارجي حتى يتم إنهاء ذلك البرنامج الذي تم تشغيله

حاولت باستخدام الأمر Shell وكذلك الأمر CreateProcess بدون فائدة

عن عائشة رضي الله عنها أن النبي صلى الله عليه وسلم قال: إن الله يحب إذا عمل أحدكم عملا أن يتقنه

نعيب زماننا والعيب فينا ... وما لزماننا عيب سوانا

ونهجو ذا الزمان بغير ذنب ... ولو نطق الزمان لنا هجانا

محمد سامر أبو سلو

#2

طيب اكتب الكود المستخدم حتي يتثني للاعضاء تصحيحه

redahashem

رضا هاشم

اللهم اصلح امورالمسلمين

سبحان الله وبحمده سبحان الله العظيم

اللهم اهلك من سبب في فرقتنا وسفك دمائنا وزاد همنا وكربنا

#3

أفتح مشروع جديد وأضف بالفورم : تايمر و كوماند

و إلصق الكود التالي:

وإذا كان أحد عنده طريقة غير هذه فليتفضل يكتبها.

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Private Sub Form_Load()
   Timer1 = False
   Timer1.Interval = 500
   'أو أكتبها في خصائص تايمر1
End Sub

Private Sub Command1_Click()

	 'هنا فتح أو تشغيل الملف الثاني
Shell "C:\22.exe", vbNormalFocus	'هنا أكتب مسار برنامجك الثاني مثل C:\22.exe

Dim hwnd As Long

	 'هنا عملية البحث عن مقبض البرنامج الثاني حتى يفتح
hh:
DoEvents 'هنا أي أنك تقول للنظام نفذ الكود التالي لكي لا يدخل برنامجك بدوامة جمود
hwnd = FindWindow(vbNullString, "هنا ضع عنوان البرنامج الثاني حرفياً")  'عنوان البرنامج هو الذي يظهر في البروسس أي العمليات والتطبيقات (أي عندما ثقوم بإنهاء المهمة )
If hwnd = 0 Then GoTo hh:

Timer1 = True
End Sub


Private Sub Timer1_Timer()
Dim hwnd As Long

	 'هنا العملية معاكسة أي أنك تريد أن تعرف أن المقبض مازال أم لا
hwnd = FindWindow(vbNullString, "هنا ضع عنوان البرنامج الثاني حرفياً")
If hwnd <> 0 Then Exit Sub

	 'هنا ضع الكود التالي بعد إغلاق البرنامج الثاني
'مثل
MsgBox "تم تفعيل الكود بعد إغلاق البرنامج الثاني"

Timer1 = False
End Sub
#4

بكل بساطة الكود المستخدم

dim comnd as string
cmnd = "calc.exe"
shell cmnd

... rerst of code execution

ولكن لا أريد تنفيذ ... rerst of code execution قبل أن يتم إنهاء البرنامج الذي تم تشغيله بواسطة الأمر shell

عن عائشة رضي الله عنها أن النبي صلى الله عليه وسلم قال: إن الله يحب إذا عمل أحدكم عملا أن يتقنه

نعيب زماننا والعيب فينا ... وما لزماننا عيب سوانا

ونهجو ذا الزمان بغير ذنب ... ولو نطق الزمان لنا هجانا

محمد سامر أبو سلو

#5

الاخ العزيز msas الموضوع ليس كيف تشغل برنامج من داخل تطبيقك -_- .. الموضوع الذي يقصده السائل هو امر يستند على ما بعد العملية التي يقوم بها البرنامج الذي تم استدعائه من داخل الكود بواسطة Shell .

اقول للاخ السائل بالنسبة لي استخدم التالي:

اضع الملف المراد تنفيذه في ملف باتش واقوم باستدعاء هذا الملف بواسطة الــ Shell طبعا يمكنك انشاء هذا الملف داخل الكود ليتعرف على المسارات :

ExtrnalProgram 
dir c:\*.* > A

مالذي يحصل هنا الذي يحصل هنا انه سيتم تنفيذ الباتش بواسطة الامر Shell ويقوم الباتش بتنفيذ الامر الاول وهو تشغيل البرنامج الخارجي واذا انتهت العمليات التي يقوم بها البرنامج الخارجي يقوم تنفيذ الامر الثاني ارسال عرض جميع الملفات في القرص C ووضعها في ملف A

في داخل الكود الخاص بي بعد عملية الــ Shell

اضع لوب لاينتهي حتى يصبح الملف A موجود تحت المسار C عندها يقوم بتنفيذ الاوامر التي ارغب في تنفيذها .

ولزيادة التوضيح :

Public Sub Create_Batch_File(ProgramName as String)
Dim LOCL_FileNum As Integer

LOCL_FileNum = FreeFile
If Len(Dir(App.Path & "\A")) > 0 Then Kill App.Path & "\A"

Open App.Path & "\batch.bat" For Output As #LOCL_FileNum
	Print #LOCL_FileNum, ProgramName
	Print #LOCL_FileNum, "dir c:\*.* > " & App.Path & "\A"
Close #LOCL_FileNum

Shell App.Path & "\batch.bat", vbHide

While Dir(App.Path & "\A", vbNormal) = ""
Wend

End Sub

ويمكنك استدعاء العمليه الفرعيه هذه من اي مكان في البرنامج الخاص بك كالتالي :

Create_Batch_File " هنا تضع مسار واسم البرنامج الخارجي مع امتداد الملف طبعا"

هنا تضع الاوامر  التي تنتظر الانتهاء من تنفيذ عمليات البرنامج الخارجي
.............
.................
.....................

تم تعديل هذه المشاركة بواسطة العقده في 26 نوفمبر 2006 في 23:13

ليس كل ما يتمناه المرء يدركه

arabteam2000.gif

#6
العقده كتب:
الاخ العزيز msas الموضوع ليس كيف تشغل برنامج من داخل تطبيقك -_- .. الموضوع الذي يقصده السائل هو امر يستند على ما بعد العملية التي يقوم بها البرنامج الذي تم استدعائه من داخل الكود بواسطة Shell .

أخي لو أنك تأكدت من اسم السائل لوجدت أنه سؤالي وأنا أوضح ما أريد وجوابك ليس ما أريد أنا استطيع التحكم بتسلسل الأوامر من خلال الباتش بالدوس ولكن هناك عمليات معالجة ستتم في البرنامج بعد إنتهاء البرنامج الذي سيتم تشغيله بواسطة الأمر shell في مثالي وأريد أن اعرف متى يقوم المستخدم بإنهاء البرنامج الخارجي حتى أستطيع متابعة المعالجة من ضمن برنامجي

عن عائشة رضي الله عنها أن النبي صلى الله عليه وسلم قال: إن الله يحب إذا عمل أحدكم عملا أن يتقنه

نعيب زماننا والعيب فينا ... وما لزماننا عيب سوانا

ونهجو ذا الزمان بغير ذنب ... ولو نطق الزمان لنا هجانا

محمد سامر أبو سلو

#7

:blink: :wacko: :s :unsure: .. استر عليا الله يستر عليك :(

ليس كل ما يتمناه المرء يدركه

arabteam2000.gif

#8

كنت عامل مثالين قديما تجدهم هنا

Detecting the exit of specific Process, With API and WMI

ولكن يبدو أن معظم المرفقات القديمة قد ذهبت ..

علي العموم مرفق كود مبسط يبين كيفية عمل ذلك ..

فقط لا تنسي أن تضع اي ملف Exe علي اامسار C:\Test.exe

Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function GetExitCodeProcess Lib "kernel32" (ByVal hProcess As Long, lpExitCode As Long) As Long

Const STILL_ACTIVE As Long = &H103
Const PROCESS_ALL_ACCESS As Long = &H1F0FFF

Private Sub Command1_Click()
 Dim lngHandle As Long, lngExit As Long, ProcID As Long
 If Dir("C:\Test.exe") = vbNullString Then Exit Sub
 Proc = Shell("C:\Test.exe", vbNormalFocus)
 lngHandle = OpenProcess(PROCESS_ALL_ACCESS, False, Proc)
 GetExitCodeProcess lngHandle, intExit
 Do While intExit = STILL_ACTIVE
	DoEvents
	GetExitCodeProcess lngHandle, intExit
 Loop
 MsgBox "process Ended"
End Sub

تم تعديل هذه المشاركة بواسطة Pharaonic_Guy في 27 نوفمبر 2006 في 09:44

#9

أخ Pharaonic_Guy هذا ما أريد بالضبط جزاك الله خيرا

عن عائشة رضي الله عنها أن النبي صلى الله عليه وسلم قال: إن الله يحب إذا عمل أحدكم عملا أن يتقنه

نعيب زماننا والعيب فينا ... وما لزماننا عيب سوانا

ونهجو ذا الزمان بغير ذنب ... ولو نطق الزمان لنا هجانا

محمد سامر أبو سلو

#10

ولكن أخيPharaonic_Guy (سؤال) أستعمال اللوب بشكل دائم لحين إغلاق البرنامج الثاني ألا يؤئرعلى ذاكرة النظام وسرعته.

 Do While intExit = STILL_ACTIVE
 DoEvents
 GetExitCodeProcess lngHandle, intExit
 Loop
#11
عبد العزيز اليوسفي كتب:
ولكن أخيPharaonic_Guy (سؤال) أستعمال اللوب بشكل دائم لحين إغلاق البرنامج الثاني ألا يؤئرعلى ذاكرة النظام وسرعته.

 Do While intExit = STILL_ACTIVE
 DoEvents
 GetExitCodeProcess lngHandle, intExit
 Loop

لا أعتقد ذلك ولكن لتجنب توقف البرنامج عن الاستجابة نستخدم DoEvents لجعل النظام يتابع العمليات التي عليه القيام بها اثناء الدوران خلال الحلقة وهذا أفضل برأيي من استخدام timer لهذه العملية

وهناك نقطة إضافية لاحظ أن الويندوز بيئة متعددة المهام Multitasking وأن كل برنامج يتم تنفيذه على مسار Thread مستقل وبالتالي دخول الحلقة - افتراضيا - في دوامة لانهائية لن يؤثر إلا على ذلك البرنامج الذي تنفذ من خلاله ولتجنب حصول عدم استجابة لذلك المسار تم استخدام DoEvents

عن عائشة رضي الله عنها أن النبي صلى الله عليه وسلم قال: إن الله يحب إذا عمل أحدكم عملا أن يتقنه

نعيب زماننا والعيب فينا ... وما لزماننا عيب سوانا

ونهجو ذا الزمان بغير ذنب ... ولو نطق الزمان لنا هجانا

محمد سامر أبو سلو

#12

مشكور أخي

لكن أنا أعرف DoEvents

ولكن أنا أقول أنه لو أستخدم تايمر كل 500 ميلي أفضل.

فإذا كنت متأكد من كلامك أي أن DoEvents و Do....Loop أفضل فيرجى التأكيد .

أو ننتظر من يعرف .

#13

لا يمكنك قول أيهما أفضل فكل حالة قد تكون معالجتها مختلفة عن الأخرى

ولكن بخصوص السؤال هنا أعتقد أن حل الحلقة أفضل من أجل التسلسل المنطقي للكود

ثم أنه بجميع الأحوال البرنامج هنا متوقف عن المعالجة ريثما يتم إنهاء البرنامج الخارجي وربما نستخدم حل التايمر الذي تقترحه عندما نريد معالجة اشياء أخرى ريثما يتم إنهاء ذلك البرنامج الخارجي وبما أنك تتحدث عن موارد النظام أعتقد أن إطلاق حدث التايمر كل 500 ميللي ثانية سيكلف النظام أكثر من الحلقة بما أنك ستقوم بإطلاق حدث ثم معالجة ذلك الحدث باستخدام نفس كود الحلقة ثم ستنفذ إجراء إضافي يحتوي بقية كود المعالجة

عن عائشة رضي الله عنها أن النبي صلى الله عليه وسلم قال: إن الله يحب إذا عمل أحدكم عملا أن يتقنه

نعيب زماننا والعيب فينا ... وما لزماننا عيب سوانا

ونهجو ذا الزمان بغير ذنب ... ولو نطق الزمان لنا هجانا

محمد سامر أبو سلو

#14

أخي الكريم أنت قلت (البرنامج هنا متوقف عن المعالجة ) فكيف يكون متوقف عن المعالجة ،يمكن أن تشرح إذا تفضلت

#15

سبب قولي ان الرنامج متوقف عن المعالجة هو

إذا لاحظت في توضيح السؤال

اقتباس
ولكن هناك عمليات معالجة ستتم في البرنامج بعد إنتهاء البرنامج الذي سيتم تشغيله بواسطة الأمر shell في مثالي وأريد أن اعرف متى يقوم المستخدم بإنهاء البرنامج الخارجي حتى أستطيع متابعة المعالجة من ضمن برنامجي

أي أنه لايريد القيام بأي عمليات من داخل البرنامج حتى ينتهي البرنامج الآخر - ربما يكون في انتظار خرج ما من ذلك البرنامج ملف مثلا - وبهذا عمليا البرنامج سيكون بوضع الانتظار وواضح أنه لايريد القيام بأي شئ من برنامجه حتى انتهاء البرنامج الثاني

ولكن ذلك لايمنع في حالات أخرى من استخدام فكرتك بخصوص التايمر إن كنا نريد القيام بأمور أخرى ريثما يتم إنهاء البرنامج الثاني

وهنا أعود لعبارتي السابقة

اقتباس
لا يمكنك قول أيهما أفضل فكل حالة قد تكون معالجتها مختلفة عن الأخرى

وبهذا فطبيعة البرنامج الذي نقوم بعمله ستفرض علينا إما استخدام طريقة الحلقة أو طريقة التايمر

عن عائشة رضي الله عنها أن النبي صلى الله عليه وسلم قال: إن الله يحب إذا عمل أحدكم عملا أن يتقنه

نعيب زماننا والعيب فينا ... وما لزماننا عيب سوانا

ونهجو ذا الزمان بغير ذنب ... ولو نطق الزمان لنا هجانا

محمد سامر أبو سلو

#16

يا أخي بارك اللّه بك

أنت قلت أعتقد ( هنا أعتقد أن حل الحلقة أفضل من أجل التسلسل المنطقي للكود ) أي في الكود السابق.

أنا أريد جواب نهائي بدون إعتقاد- أدامك اللّه- أيهما أفضل في هذا المثال وفقط.

فإذا كنت متأكد فبارك اللّه بك .

تم تعديل هذه المشاركة بواسطة عبد العزيز اليوسفي في 28 نوفمبر 2006 في 01:15

#17

في هذا المثال حل الحلقة أفضل بشكل مؤكد - من وجهة نظري -

عن عائشة رضي الله عنها أن النبي صلى الله عليه وسلم قال: إن الله يحب إذا عمل أحدكم عملا أن يتقنه

نعيب زماننا والعيب فينا ... وما لزماننا عيب سوانا

ونهجو ذا الزمان بغير ذنب ... ولو نطق الزمان لنا هجانا

محمد سامر أبو سلو

هذا الموضوع مغلق.

مواضيع مشابهة