اوامر dos تعطل البرنامج
#1
السلام عليكم
استعملت اجراء لاوامر الدوس من خلال الدلفي
   Procedure getoutputdos
نجح الامر ولكن يتعطل البرنامج حتى نهاية التنفيذ 
فما السبب وما الحل
الرد
#2
غريب جوجل لايعطي اي نتيجة عن هذا الاسم getoutputdos هل هذه دالة محلية ؟
الرد
#3
(11-02-2022, 09:29 PM)Ndagor كتب : غريب جوجل لايعطي اي نتيجة عن هذا الاسم getoutputdos هل هذه دالة محلية ؟

مرحبا
كلا وجدتها على احد المواقع اعتقد stackoverflow

انها تنفذ الامر لكن البرنامج يتوقف حتى تتم العملية كاملة ثم يعود لطبيعته
الرد
#4
و عليكم السلام و رحمة الله

للأسف،
استسمحك اخي الكريم ان انوه الى ان طريقة طرح الاشكال سئة جدا و لا تساعد من يطلع على الموضوع ان يجد حل للاشكال...
1- المشاركة الأولى مبهمة...
2- المشاركة الثانية لم ترفق فيها الخوارزمية (مع انها عندك) و اكتفيت فقط بذكر انك اخذتها من موقع ما...

لست ادري !!!؟ كثير من المشاركات في قسم الأسئلة تحتاج الى crystal ball لفهم الاشكال و طرح محاولة حله...

في هذه المشاركة لموضوع سابق، كان عندي نفس التعقيب و حصلت على هذه الاجابة :
https://delphi4arab.net/forum/showthread...0#pid54590
هذا تعليق الأخ:
إقتباس :ولا تكن قاسيا في ردك لأني أكلمك باللغة التي أفهمها وتفهما وإلا كلمتك بلغة لاتفهمها أنت ولا غير . على كل شكرا على تعليقك.

بعيد عن "الدوافع النفسية و سوء الفهم" طرح الاشكال يجب ان يكون عبر الأوامر Code snippets التي لم تعمل و صور Captures للاستثناءات التي يظهرها الـــ Compiler/Linker
و اصارحك القول اخي الكريم اني اطلعت على الموضوع في اول ساعات نشره و اهملت عمدا الرد بسبب طريقة طرحه...

كنت اتمنى ان يطلع الأعضاء على هذا الموضوع الذي كتبته بعضوية اخرى و ان يحاولوا اخذ فكرة و طرح الاشكال بطريقة تسهل و تربح الوقت لمن يريد المساعدة:
https://delphi4arab.net/forum/showthread.php?tid=11617
[-] كل من 1 user says قال شكرا ل I3CT على المشاركة المفيدة
  • jeanjamil
الرد
#5
هل جربت BeginThread التي تسمح بتنفيذ الامر في Thread مستقل مايمنع جمود البرنامج حتى نهاية العملية
الرد
#6
(12-02-2022, 01:07 PM)I3CT كتب : و عليكم السلام و رحمة الله

للأسف،
استسمحك اخي الكريم ان انوه الى ان طريقة طرح الاشكال سئة جدا و لا تساعد من يطلع على الموضوع ان يجد حل للاشكال...
1- المشاركة الأولى مبهمة...
2- المشاركة الثانية لم ترفق فيها الخوارزمية (مع انها عندك) و اكتفيت فقط بذكر انك اخذتها من موقع ما...

لست ادري !!!؟ كثير من المشاركات في قسم الأسئلة تحتاج الى crystal ball لفهم الاشكال و طرح محاولة حله...

في هذه المشاركة لموضوع سابق، كان عندي نفس التعقيب و حصلت على هذه الاجابة :
https://delphi4arab.net/forum/showthread...0#pid54590
هذا تعليق الأخ:
إقتباس :ولا تكن قاسيا في ردك لأني أكلمك باللغة التي أفهمها وتفهما وإلا كلمتك بلغة لاتفهمها أنت ولا غير . على كل شكرا على تعليقك.

بعيد عن "الدوافع النفسية و سوء الفهم" طرح الاشكال يجب ان يكون عبر الأوامر Code snippets التي لم تعمل و صور Captures للاستثناءات التي يظهرها الـــ Compiler/Linker
و اصارحك القول اخي الكريم اني اطلعت على الموضوع في اول ساعات نشره و اهملت عمدا الرد بسبب طريقة طرحه...

كنت اتمنى ان يطلع الأعضاء على هذا الموضوع الذي كتبته بعضوية اخرى و ان يحاولوا اخذ فكرة و طرح الاشكال بطريقة تسهل و تربح الوقت لمن يريد المساعدة:
https://delphi4arab.net/forum/showthread.php?tid=11617

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

   ; procedure TForm4.GetDosOutput(CommandLine, WorkDir: string;aMemo : Tmemo)
var
 ; SA: TSecurityAttribute
 ; SI: TStartupInfo
;  PI: TProcessInformation
;  StdOutPipeRead, StdOutPipeWrite: THandle
 ; WasOK: Boolean
 ; Buffer: array[0..255] of AnsiChar
;  BytesRead: Cardinal
 ; Handle: Boolean
begin

;  AMemo.Lines.Add('Commencing processing...')
  with SA do begin
  ;  nLength := SizeOf(SA)
 ;   bInheritHandle := True
 ;   lpSecurityDescriptor := nil
end

;  CreatePipe(StdOutPipeRead, StdOutPipeWrite, @SA, 0)
  try
    with SI do
    begin
     ; FillChar(SI, SizeOf(SI), 0)
    ;  cb := SizeOf(SI)
      dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES
      wShowWindow := SW_HIDE
      hStdInput := GetStdHandle(STD_INPUT_HANDLE); // don't redirect stdin
      hStdOutput := StdOutPipeWrite
      hStdError := StdOutPipeWrite
    end
;    Handle := CreateProcess(nil, PChar('cmd.exe /C ' + CommandLine)
                            nil, nil, True, 0, nil
                            PChar(WorkDir), SI, PI)
    ;CloseHandle(StdOutPipeWrite)

      if Handle then
    ;application.ProcessMessages
      try
        repeat
          WasOK := ReadFile(StdOutPipeRead, Buffer, 255, BytesRead, nil)
          if BytesRead > 0 then
          begin
            Buffer[BytesRead] := #0
           ; AMemo.Text := AMemo.Text + string(Buffer)
          end
      until
        not
        WasOK
        or (BytesRead = 0)
      WaitForSingleObject(PI.hProcess, INFINITE)
    finally
        CloseHandle(PI.hThread)
       ; CloseHandle(PI.hProcess)
      end
  finally
   ; CloseHandle(StdOutPipeRead)
   ('') AMemo.Lines.Add
 ; ('*******************************')  AMemo.Lines.Add
   ; AMemo.Lines.Add('Processing completed successfully.')
  ; ('*******************************') AMemo.Lines.Add
;   ('') AMemo.Lines.Add

  ;end
  ;end
;end
الرد
#7
الأوامر التي ارفقتها في مشاركتك الأخيرة تحتوي على:
WaitForSingleObject(PI.hProcess, INFINITE)
و هذا يحعل متابعة التنفيذ يتوقف الى غاية انتهاء عمل البرنامج المستهدف... (خصوصا اذا كان البرنامج المستهدف ينتظر ان يدخل المستخدم شئ ما)
انصحك ان تغير wShowWindow := SW_HIDE الى wShowWindow := SW_SHOWNORMAL لكي تفهم ما يطلبه البرنامج المستهدف...
إقتباس :لدي سؤال اخر في نفس الموضوع عن كيقية اضافة progressbar  لمعرفة الوقت المتبقي لانهاء التنفيذ
اعتماد ProgressBar معقد للحصول على وقت معالجة ما يقوم به البرنامج المستهدف (لانه مستقل بذاته)
كحل اولي، اضافة فحص يتأثر بتحديد وقت الانتظار (Time out)
الرد


التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم