نمایش نتایج 1 تا 23 از 23

نام تاپیک: تشخیص Suspend شدن یک پروسه.

  1. #1

    Arrow تشخیص Suspend شدن یک پروسه.

    با سلام.
    یه برنامه جانبی دارم که من ننوشتم.
    از دوستان سوال کردم که چطوری باید تشخیص بدم که پروسه این برنامه Suspend شده.
    زحمت کشیدند و یه راه حلهایی رو فرمودند.
    یکی اینکه یه مسیج برا اون برنامه بفرستیم و Flag تردش رو بگیریم. اگه جواب داد یعنی فعاله و در غیر این صورت یعنی Suspend شده.
    آیا این روش صحیحه و چطوری باید پیاده سازیش کنیم.
    ممنون میشم اگه با کد دوستان توضیح بدهند.


  2. #2

    نقل قول: تشخیص Suspend شدن یک پروسه.

    دیروز پشت تلفن من درست متوجه نشدم چی میگی ، کی بهت همچین پیشنهادی داده ؟!

    3 تا راه داری :

    1- از تابع WaitForSingleObject استفاده کنی و هندل Thread برنامه رو همراه با یک زمان Timeout بهش بدی ، اگر در زمان تعیین شده ترد پاسخی نده تابع مقدار WAIT_ABANDONED رو برگشت میده .

    2- میتونی با تابع SuspendThread ترد رو Suspend کنی اگر تابع کارش رو درست انجام بده مقداری به جز 0 برمیگردوه و معلوم میشه Thread متوقف نبوده که تونسته به درخواست شما جواب بده ، بلافاصله بعد از این کار با تابع ResumeThread ترد رو با حالت اولیه بر میگردونید ، اگر هم 0 برگردوند یعنی Suspend بوده و نتونسته به درخواست شما پاسخ بده .

    3- دیروز برات توضیح دادم ...

  3. #3

    نقل قول: تشخیص Suspend شدن یک پروسه.

    به نظرم استفاده از WaitForSingleObject بهترین گزینه باشه .

  4. #4

    نقل قول: تشخیص Suspend شدن یک پروسه.

    ممنون
    کد زیر رو ببین:
    var h:THandle;
    begin
    h:=Handle;
    if WaitForSingleObject(H,1000) <> wait_timeout then
    BEGIN
    ShowMessage('yes');
    end else
    begin
    ShowMessage('No');
    end;

    چطوری هندل برنامه مورد نظر رو بدم.؟؟؟؟؟؟؟؟؟؟


  5. #5

    نقل قول: تشخیص Suspend شدن یک پروسه.

    نقل قول نوشته شده توسط Delphi-7 مشاهده تاپیک
    ممنون
    کد زیر رو ببین:
    var h:THandle;
    begin
    h:=Handle;
    if WaitForSingleObject(H,1000) <> wait_timeout then
    BEGIN
    ShowMessage('yes');
    end else
    begin
    ShowMessage('No');
    end;

    چطوری هندل برنامه مورد نظر رو بدم.؟؟؟؟؟؟؟؟؟؟
    باید هندل Main Thread برنامه مورد نظر رو به دست بیاری و بهش پاس بدی ، یه نگاهی به کامپوننت ProcessInfo بنداز ، البته خودت هم میتونی به دست بیاریش ( OpenThread )

  6. #6

    نقل قول: تشخیص Suspend شدن یک پروسه.

    با سلام
    من با ProcessInfo هندل برنامه اول رو میگیرم. بعد دستی وارد برنامه دوم میکنم.
    با اینکه برنامه اول رو Suspend کردم اما بازم برنامه من نشون میده که ترد در حال اجراست.
    آقا مجتبی دارم کچل میشم
    کد استفاده شده در برنامه دوم:
    var h:THandle;
    begin
    h:=StrToInt(Edit1.Text);
    if WaitForSingleObject(H,3000) <> wait_timeout then
    BEGIN
    ShowMessage('Yes');
    end else
    begin
    ShowMessage('No');
    end;

    و نمونه برنامه ای هم که هندل خودش رو بدست میاره ضمیمه کردم.
    فایل های ضمیمه فایل های ضمیمه


  7. #7

    نقل قول: تشخیص Suspend شدن یک پروسه.

    با استفاده از تابع NtQuerySystemInformation و Thread_Information که مقدار State اون suspend بودن رو مشخص میکنه


    SYSTEM_THREAD = packed record
    KernelTime: LARGE_INTEGER;
    UserTime: LARGE_INTEGER;
    CreateTime: LARGE_INTEGER;
    WaitTime: DWORD;
    StartAddress: DWORD; // starting address of the thread
    UniqueProcess: DWORD; // process ID (PID)
    UniqueThread: DWORD; // thread ID (TID)
    Priority: integer; // current priority
    BasePriority: DWORD; // initial priority
    ContextSwitchCount: DWORD;
    State: integer; // thead state: active (<5), waiting (5)
    WaitReason: integer; // waiting reason (5 = suspended)
    Reserved1:DWORD;
    end;

  8. #8

    نقل قول: تشخیص Suspend شدن یک پروسه.

    WaitForSingleObject برای بررسی Suspend بودن یک Thread کمک خاصی بهتون نمیکنه؛ می تونید از همون تابع SuspendThread استفاده کنید و مقدار خروجی اش را بررسی کنید.


    وَ سَيَعْلَمُ الَّذِينَ ظَلَمُوا [آل محمد حقهم] أَيَّ مُنْقَلَبٍ يَنْقَلِبُونَ - الشعراء (227)
    و ظالمین [حق آل محمد (ص) ] به زودی خواهند دانست که به کدام بازگشتگاه بازخواهند گشت.

  9. #9
    کاربر دائمی
    تاریخ عضویت
    فروردین 1388
    محل زندگی
    ایران سرای من است
    پست
    2,655

    نقل قول: تشخیص Suspend شدن یک پروسه.

    استفاده از SuspendThread کار مناسبی نیست چون ممکنه با این کار آخرین شمارنده برای توقف ضروری ترد رو افزایش بدید و خود برنامه اصلی هم نتونه کار خودش رو به درستی انجام بده.
    ولی در مورد اینکه نتیجه SuspendThread میتونه مشخص کنه که ترد میتونه پاسخ مثبت بده یا نه تقریبا نتیجه اتفاقی رو میتونه در بر داشته باشه.
    به نظرم استفاده از WaitForSingleObject بهترین گزینه باشه .
    هر شی بدون اجبار نباید با متد فوق جواب بگیره برای استفاده و پاسخ به WaitForSingleObject باید توسط CreateEvent رویداد ساخته بشه.
    باید هندل Main Thread برنامه مورد نظر رو به دست بیاری و بهش پاس بدی ، یه نگاهی به کامپوننت ProcessInfo بنداز
    اون هندلی که WaitForSingleObject لازم داره هندل ترد نیست هندل یک رویداده که باید تعریف بشه.

  10. #10

    نقل قول: تشخیص Suspend شدن یک پروسه.

    نقل قول نوشته شده توسط علی کشاورز مشاهده تاپیک
    WaitForSingleObject برای بررسی Suspend بودن یک Thread کمک خاصی بهتون نمیکنه؛ می تونید از همون تابع SuspendThread استفاده کنید و مقدار خروجی اش را بررسی کنید.
    اون مورد WaitForSingleObject رو تو انجمن های مایکروسافت پیشنهاد داده بودند و در ضمن تو راهنما MSDN در مورد این تابع آورده شده :

    The WaitForSingleObject function checks the current state of the specified object. If the object's state is nonsignaled, the calling thread enters the wait state until the object is signaled or the time-out interval elapses.

    The WaitForSingleObject function can wait for the following objects:
    Change notification
    Console input
    Event
    Memory resource notification
    Mutex
    Process
    Semaphore
    Thread
    Waitable timer
    یعنی این تابع میتونه برای بررسی یک Thread هم استفاده بشه ، البته تو همون راهنما گفته شده ترد فراخوان باید دسترسی این کار رو داشته باشه ، آیا من اشتباه متوجه شدم ؟

  11. #11

    نقل قول: تشخیص Suspend شدن یک پروسه.

    میشه بیشتر توضیح بدید.
    استفاده از SuspendThread کار مناسبی نیست چون ممکنه با این کار آخرین شمارنده برای توقف ضروری ترد رو افزایش بدید و خود برنامه اصلی هم نتونه کار خودش رو به درستی انجام بده.
    ولی در مورد اینکه نتیجه SuspendThread میتونه مشخص کنه که ترد میتونه پاسخ مثبت بده یا نه تقریبا نتیجه اتفاقی رو میتونه در بر داشته باشه.


  12. #12

    نقل قول: تشخیص Suspend شدن یک پروسه.

    یک راه دیگه به ذهنم رسید و تست کردم و جواب هم داد ، میتونید با تابع SendMessageTimeout یک پیغام به پنجره برنامه مورد نظر بفرستید ، همونطور که میدونید تابع SendMessage تا زمان پردازش نشدن پیغام ارسالی در برنامه مقصد منتظر پردازش میمونه ، تابع SendMessageTimout همین کار رو با مدت زمان تعیین شده میکنه یعنی اگر شما زمان Timeout رو 10 میلی ثانیه قرار دادی اگر تابع SendMessage بعد از ارسال پیغام تا 10 میلی ثانیه بعد جوابی دریافت نکرد Timeout میده ، بنابراین اگر ترد برنامه مقصد Suspend باشه نمیتونه پیغام ارسالی رو پردازش کنه و تابع Timeout میده و شما میتونی متوجه Suspend شدن Thread بشی :

    var
    Handle, Result: Cardinal;
    begin
    Handle:= FindWindow('TForm1', 'Form1');
    SendMessageTimeout(Handle, WM_Null, 0, 0, 0, 10, Result);
    if Result= 0 then
    ShowMessage('Runned')
    else
    ShowMessage('Suspended !');
    end;

  13. #13

    نقل قول: تشخیص Suspend شدن یک پروسه.

    ممنون از وقتی که گزاشتی.
    اما به من جواب نداد. همش اعلام میکنه Runned.


  14. #14

    نقل قول: تشخیص Suspend شدن یک پروسه.

    مطمئن هستید Main Thread برنامه Suspend هست ؟ زمان مربوط به Timeout رو کاهش بدید .

  15. #15

    نقل قول: تشخیص Suspend شدن یک پروسه.

    نمونه برنامه ها رو نگاه کنید.(حتی اگه برنامه ای هم در حال اجرا نباشه نشون میده که اجراست)
    فایل های ضمیمه فایل های ضمیمه


  16. #16

    نقل قول: تشخیص Suspend شدن یک پروسه.

    استفاده از SuspendThread کار مناسبی نیست چون ممکنه با این کار آخرین شمارنده برای توقف ضروری ترد رو افزایش بدید و خود برنامه اصلی هم نتونه کار خودش رو به درستی انجام بده.
    ولی در مورد اینکه نتیجه SuspendThread میتونه مشخص کنه که ترد میتونه پاسخ مثبت بده یا نه تقریبا نتیجه اتفاقی رو میتونه در بر داشته باشه.
    SuspendThread در هیچ جایی به جز debugger استفاده نداره، پس نیازی نیست که برنامه چک کننده نگران این موضوع باشه. SuspendThread و ResumeThread توابع مربوط به debugger ها در ویندوز هستند، نه توابع مربوط به کنترل عادی جریان برنامه.

    هر شی بدون اجبار نباید با متد فوق جواب بگیره برای استفاده و پاسخ به WaitForSingleObject باید توسط CreateEvent رویداد ساخته بشه.
    اون هندلی که WaitForSingleObject لازم داره هندل ترد نیست هندل یک رویداده که باید تعریف بشه.
    همچین چیزی صحیح نیست؛ WaitForSingleObject با هر Object ایی که امکان Synchronize شدن داشته باشه، کار میکنه. Process ها و Thread ها هم یکی از این نوع Object ها هستند.

    اون مورد WaitForSingleObject رو تو انجمن های مایکروسافت پیشنهاد داده بودند و در ضمن تو راهنما MSDN در مورد این تابع آورده شده
    گفته وضعیت Signaled بودن یا non-signaled بودن یک object رو چک میکنه، اما نگفته که آیا suspend شدن یک thread رو به عنوان Non-signaled در نظر میگیره یا نه، که در عمل نمیگیره.


    وَ سَيَعْلَمُ الَّذِينَ ظَلَمُوا [آل محمد حقهم] أَيَّ مُنْقَلَبٍ يَنْقَلِبُونَ - الشعراء (227)
    و ظالمین [حق آل محمد (ص) ] به زودی خواهند دانست که به کدام بازگشتگاه بازخواهند گشت.

  17. #17

    نقل قول: تشخیص Suspend شدن یک پروسه.

    نقل قول نوشته شده توسط Gold مشاهده تاپیک
    نمونه برنامه ها رو نگاه کنید.(حتی اگه برنامه ای هم در حال اجرا نباشه نشون میده که اجراست)
    اخوی شما هم کارهایی میکنی ها ... !

    با این فایل های exe خوب من از کجا بدونم چی نوشتی و اشکال کجاست ؟ در ضمن برنامه دوم که چکش میکنی چه طور Suspend میشه ؟

  18. #18
    کاربر دائمی
    تاریخ عضویت
    فروردین 1388
    محل زندگی
    ایران سرای من است
    پست
    2,655

    نقل قول: تشخیص Suspend شدن یک پروسه.

    همچین چیزی صحیح نیست؛ WaitForSingleObject با هر Object ایی که امکان Synchronize شدن داشته باشه، کار میکنه. Process ها و Thread ها هم یکی از این نوع Object ها هستند.
    به دردم نخورده امتحانش کنم ولی به نظرم فقط برای Terminate جواب میده نه suspend یا هر enevt دیگه. به همین دلیل باید هندل event ساخته بشه .

    Thread The CreateProcess, CreateThread, or CreateRemoteThread function returns the handle. A thread object's state is signaled when the thread terminates.

  19. #19

    نقل قول: تشخیص Suspend شدن یک پروسه.

    نقل قول نوشته شده توسط مجتبی تاجیک مشاهده تاپیک
    اخوی شما هم کارهایی میکنی ها ... !

    با این فایل های exe خوب من از کجا بدونم چی نوشتی و اشکال کجاست ؟ در ضمن برنامه دوم که چکش میکنی چه طور Suspend میشه ؟
    شرمنده حق با شماست...
    در ضمن برنامه تستی رو با Process Explorert ساسپند میکنم.
    فایل های ضمیمه فایل های ضمیمه
    • نوع فایل: rar t2.rar‏ (158.4 کیلوبایت, 6 دیدار)
    • نوع فایل: rar t1.rar‏ (172.6 کیلوبایت, 6 دیدار)


  20. #20

    نقل قول: تشخیص Suspend شدن یک پروسه.

    نقل قول نوشته شده توسط Gold مشاهده تاپیک
    شرمنده حق با شماست...
    در ضمن برنامه تستی رو با Process Explorert ساسپند میکنم.
    من تست کردم وقتی از SendMessageTimeout استفاده میکنی یک بار Suspended میده و یک بار Runned و این کار هم تکرار میشه و ترتیبش هم مشخص نیست یعنی بسته به زمان Timeout ممکنه برنامه به پیغام رسیده شده جواب بده ، تنها چیزی که به ذهنم میرسه این هست که از خروجی این تابع چند بار پشت سر هم نمونه گیری کنیم و در آخر کار نتیجه رو بررسی کنیم ، من یه کد نوشتم و تست کردم و این بار مشکل قبلی رو نداشت و خیلی راحت وضعیت برنامه رو مشخص کرد :

    var
    Result, Time: Dword;
    Retval: LongInt;
    Timeout, i, Count: Byte;
    Hand: THandle;
    begin
    Hand:= FindWindow('TForm1', 'TestAPP');
    if Hand<> 0 then
    begin
    Timeout:= 10;
    Count:= 0;
    for i:= 0 to 10 do
    begin
    Time:= GetTickCount;
    Retval:= SendMessageTimeout(Hand, WM_NULL, 0, 0, SMTO_ABORTIFHUNG or SMTO_BLOCK, Timeout, Result);
    Time:= GetTickCount - Time;
    if Retval= 0 then
    if Time < Timeout then
    Inc(Count)
    else
    Dec(Count);
    end;
    if Count <= 5 then
    ShowMessage('Runned')
    else
    ShowMessage('Suspended');
    end else
    ShowMessage('Can not find window ! ');
    end;


    تست کنید اگر باز هم مشکلی بود خبر بدید .

  21. #21

    نقل قول: تشخیص Suspend شدن یک پروسه.

    ممنون.
    واقع تشکر . خیلی جالب بود.
    فقط یه مشکل کوچیک دیگه میمونه. برنامه اصلی که میخام متوجه Suspend شدنش بشم دارای 4 تا ترد هست.
    اما این کد فقط Suspend شدن ترد اصلی رو متوجه میشه.
    البته دارم روش کار میکنم خودمم.
    بازم ممنون.


  22. #22

    نقل قول: تشخیص Suspend شدن یک پروسه.

    فقط یه مشکل کوچیک دیگه میمونه. برنامه اصلی که میخام متوجه Suspend شدنش بشم دارای 4 تا ترد هست.
    اما این کد فقط Suspend شدن ترد اصلی رو متوجه میشه.
    دریافتپیام فقط برای Thread های دارای Message Loop امکان پذیر هست. اگر سایر Threadها این رو نداشته باشند (که معمولا ندارند)، نمی تونید براشون پیام بفرستید.


    وَ سَيَعْلَمُ الَّذِينَ ظَلَمُوا [آل محمد حقهم] أَيَّ مُنْقَلَبٍ يَنْقَلِبُونَ - الشعراء (227)
    و ظالمین [حق آل محمد (ص) ] به زودی خواهند دانست که به کدام بازگشتگاه بازخواهند گشت.

  23. #23

    نقل قول: تشخیص Suspend شدن یک پروسه.

    نقل قول نوشته شده توسط Gold مشاهده تاپیک
    ممنون.
    واقع تشکر . خیلی جالب بود.
    فقط یه مشکل کوچیک دیگه میمونه. برنامه اصلی که میخام متوجه Suspend شدنش بشم دارای 4 تا ترد هست.
    اما این کد فقط Suspend شدن ترد اصلی رو متوجه میشه.
    البته دارم روش کار میکنم خودمم.
    بازم ممنون.
    ساده ترین راهی که باقی میمونه تابع SuspendThread و ResumeThread هست که قبلا توضیح دادم .

برچسب های این تاپیک

قوانین ایجاد تاپیک در تالار

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