Выполнение цикла в фоновом режиме C

#c

#c

Вопрос:

Я пытаюсь создать цикл для проверки отладчика каждые 3 секунды или около того, и я знаю, что мне нужна многопоточность, но мне нужен пример или что-то в этом роде, поскольку я действительно новичок в C

Я не могу просто выполнить его обычным циклом, потому что тогда остальная часть моего кода не будет выполняться.

 void loop() {
    for (;;) {
        if (IsDebuggerPresent())
        {
            exit(1);
        }
        if (TRUE == CheckRemoteDebuggerPresent(GetCurrentProcess(), amp;bDebuggerPresent) amp;amp;
            TRUE == bDebuggerPresent)
        {
            exit(2);
        }
        
    }
}
int main()
{
    std::thread t1(loop); //activates loop
    if (t1.joinable()) {
        t1.join();
        t1.detach();
    }
}
 

Комментарии:

1. Это не так уж плохо, если вы вставляете основную часть своей программы перед оператором if . Процесс объединения — это просто очистка, которая должна произойти до завершения вашего процесса.

2. Возможно, вам не следует присоединяться к вашему потоку, если вы хотите продолжить выполнение в порождающем потоке.

3. Передавайте код сразу после std::thread t1(loop); , а не после оператора if, и другое дело, что ваш поток никогда не присоединится, потому что он бесконечен.

4. TRUE == blah действительно уродливо. Должно быть достаточно просто вызова функции.

5. Да, не используйте условные обозначения Yoda (избавьтесь от привычки обходить их) и используйте правильные true и false , а не старые макросы C… но только при необходимости, чего здесь нет, как сказано.

Ответ №1:

остальная часть моего кода не будет выполняться.

Смотрите ниже.

 int main()
{
    std::thread t1(loop); // activates loop

    // PUT YOUR CODE HERE.

    if (t1.joinable()) {  // shuts down loop
        t1.join();        // join OR detach.  Not both.
    }
}
 

Комментарии:

1. может быть, удалите detach after join , или он делает что-то полезное, о чем я не знаю?

2. @largest_prime_is_463035818 Я очень уверен, что вы правы.