Задержка в процессе по условию из другово процесса

Тема в разделе "WASM.WIN32", создана пользователем Fallout, 24 сен 2004.

  1. Fallout

    Fallout New Member

    Публикаций:
    0
    Регистрация:
    25 апр 2004
    Сообщения:
    94
    Адрес:
    Russia
    с названием темы надеюсь не перемудрил вот размышляю каким образом можно сделать следующие когда в одном процессе начинается выполнятся определённый участок кода процесс тормозится пока из него например по определённому адресу не получат значение или ещё как нибудь смысл в том чтоб второй процесс подал сигнал первому когда он закончил....



    можно конечно попробовать сделать хитро послать через сенд месейдж окну второго процесса ид текущего трида и засуспендить её.. далее когда второй процесс сделает свои дела он зарезюмит данную нитку... может есть какие нибудь более красивые варианты?.. да и чтоб второй процесс знал что код в данной точке в первом случаи это через чендмесейдж как раз бы и было
     
  2. Julius

    Julius New Member

    Публикаций:
    0
    Регистрация:
    31 окт 2003
    Сообщения:
    42
    Прочитал... и ничего не понял.

    Если требуется осуществить синхронизацию процессов, то для этого обычно используют объекты синхронизации. Например, именованные объекты события (CreateEvent,OpenEvent). И функции ожидания, типа

    WaitForSingleObject.

    Если требуется передавать данные между двумя процессами для этого есть методы межпроцессного взаимодействия, например, именованные пайпы, маилслоты, отображаемые в память файлы. На худой конец можно использовать разделяемую секцию данных в общей DLL'ке, или WM_COPYDATA.
     
  3. Fallout

    Fallout New Member

    Публикаций:
    0
    Регистрация:
    25 апр 2004
    Сообщения:
    94
    Адрес:
    Russia
    Мда красноречием я н лицоещу.. задача после того как процес дойдёт до адреса xxxxxxx он останавливается и продолжится только тогда когда второй процесс сделает все свои вмешательства



    Задачи:

    а)Сообщить второму процессу что проишла оставновка

    б)Тормознуть процесс

    в)Запустить его обратно из второго процесса



    я подумывал сделатать так послать сообщение окну второго процесса с ИД текущего трида и после посыла засуспендить этот трид далее после своих дел второй процесс имея трид который получил от первого процесса просто его рассуспендит и всё...
     
  4. Funbit

    Funbit Member

    Публикаций:
    0
    Регистрация:
    13 апр 2003
    Сообщения:
    92
    Адрес:
    Russia
    первое что пришло в голову:



    во втором процессе сразу создать объект Event2 и сделать thread, в котором будет WaitForSingleObject. т.е. второй процесс ждет.



    в первом процессе, когда нужно будет сообщить второму о том, что тот может начинать производить какие-то действия, создать Event1, сделать SetEvent Event2 и тут же сделать WaitForSingleObject Event1.



    второй процесс рассуспендится ( :) ) сделает работу и в конце сделает SetEvent Event1. тред закончить свою работу (ret сделает) ну а первый процесс продолжит работу.



    вообще у рихтера про синхронизацию все есть, почитай
     
  5. Fallout

    Fallout New Member

    Публикаций:
    0
    Регистрация:
    25 апр 2004
    Сообщения:
    94
    Адрес:
    Russia
    Угу спасибо... примено так и нуна сделать
     
  6. Fallout

    Fallout New Member

    Публикаций:
    0
    Регистрация:
    25 апр 2004
    Сообщения:
    94
    Адрес:
    Russia
    плохой конект был ... задублилось месага
     
  7. Fallout

    Fallout New Member

    Публикаций:
    0
    Регистрация:
    25 апр 2004
    Сообщения:
    94
    Адрес:
    Russia
    Тэкс нашёл время чтоб всё сделать +) вообщем сделал евент внедрил код в ехе на вызов функции вызываю свой...

    типа



    Call Orig_Exe_Func



    стало



    Call My_Stub





    так теперь тот код что я генерю в своей программке и каким патчу код....



    push eax

    push event

    call SetEvent

    pop eax

    call Orig_Exe_Func

    ret







    в моей программе ..



    WaitForSingleObject(event, -1);

    printf("Cool\n");



    так вот SetEvent возвращает 0!... мм странно хендл от созданного евента разве не глобален?.. и что доступен только в контексте процесса в котором был создан?...



    когда создал я евент получил хенддл именно его и прописываю в код... другого процесса... из моего процесса всё ок а вот другой процесс не сигналит...
     
  8. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
    в зависимости от задачи есть

    event - просто событие (включено или выключено)

    mutex - открывается как файл, пока один держит - все остальные ждут.

    semaphor - тоже самое, но на определенное количество подключений (например, не более 3х)
     
  9. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine


    э! нужно в другом процессе его заново открыть, или это дочерний процесс должен быть создан с наследованием хэндлов
     
  10. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
    мне ща бежать надо - вот мои прим на дельфях
     
  11. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
    не прилепило :dntknw:
     
  12. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
    я не глянул - там экзешники были ;)

    во я себе планку поднял ;)

    [​IMG] _1160461444__Delphi.zip
     
  13. Fallout

    Fallout New Member

    Публикаций:
    0
    Регистрация:
    25 апр 2004
    Сообщения:
    94
    Адрес:
    Russia
    Мм заново открывать?... ок спасибо теперь всё ястно .... хотя и не очень удобно мне бы что нибудь очень унивирсальное и миниатюрное но спасибо за помощь....



    процесс вообще чужой +) но не важно это так..
     
  14. Fallout

    Fallout New Member

    Публикаций:
    0
    Регистрация:
    25 апр 2004
    Сообщения:
    94
    Адрес:
    Russia
    Если кому интерестно то очень удобное место для записи в рантайм вашего кода... можно смело затереть стартовый код по адресу который можно взять из ПЕ структуры EntryPoint +) .... в Си++ а может и ещё каких компилятора... там стартовый код есть который больше обычно не нужен так что смело можно затирать и адрес всегда будете знать этого места +)
     
  15. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
    если это не системный процесс, а просто приложение - запусти его из своей проги через CreateProcess с наследованием хэндлов
     
  16. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    >


    >




    Может те в сторону Debugging Functions смотреть лучше?
     
  17. Fallout

    Fallout New Member

    Публикаций:
    0
    Регистрация:
    25 апр 2004
    Сообщения:
    94
    Адрес:
    Russia
    Ну по поводу создания процесса с наследованием это немного не то процесс уже работает... я должен именно в рантайм все сделать...



    2S_T_A_S_ - уже сделал... но хочу теперь без них...
     
  18. Fallout

    Fallout New Member

    Публикаций:
    0
    Регистрация:
    25 апр 2004
    Сообщения:
    94
    Адрес:
    Russia
    Ещё возник вопросик можно кончено сделать семпл и проверить но млаоли не всегда будет срабатывать или ещё что смысл вот в чём... обойтись одним евентом...



    1)создать евент который сам сбрасывается после функции WaitForSingleObject

    2)Далее в чужом процесс открыть его получить хендл и тд ит .... ну и вот такой код сделать



    В чужом процессе



    SetEvent(MyEvent);

    WaitForSingleObject(MyEvent, -1);

    printf("Hello World");



    В моём...

    WaitForSingleObject(MyEvent, -1);

    prontf("Back off");



    вот интерестно что выведется ... то бишь будет выведена надпись "Back off" и евент сбросится и тогда вторая надпись не выведится .. либо будет выведена надпись "Hello World" евент сбросится и тоэе больше ничего не будет ... либо будет две надписи?