#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
afterjoin
, или он делает что-то полезное, о чем я не знаю?2. @largest_prime_is_463035818 Я очень уверен, что вы правы.