C ++ "система" без ожидания (Win32) - PullRequest
2 голосов
/ 06 февраля 2012

У меня есть программа, которая проверяет, есть ли обновление версии на сервере. Теперь я должен сделать что-то вроде

if(update_avail) {
    system("updater.exe");
    exit(0);
}

но не дожидаясь завершения "updater.exe". В противном случае я не могу заменить основную программу, потому что она работает. Так как выполнить "updater.exe" и сразу выйти? Я знаю способ * nix с fork и так далее, как это сделать в Windows?

Ответы [ 3 ]

5 голосов
/ 06 февраля 2012

Использовать CreateProcess () , он работает асинхронно. Тогда вам нужно будет только убедиться, что updater.exe может выполнить запись в исходный EXE-файл, что можно сделать, подождав или повторив попытку до завершения исходного процесса. (С льготным интервалом, конечно.)

4 голосов
/ 06 февраля 2012

В Win32 нет fork(). Вызов API, который вы ищете, называется ::CreateProcess(). Это основная функция, которую использует system (). ::CreateProcess() по своей сути асинхронный: если вы не ожидаете конкретного возвращенного дескриптора процесса, вызов не является блокирующим.

Существует также функция более высокого уровня ::ShellExecute(), которую можно использовать, если вы не перенаправляете стандартный ввод-вывод процесса или не выполняете ожидание процесса. Это дает преимущество в поиске исполняемого файла в системной переменной PATH, а также в возможности запуска командных файлов и даже запуска программы, связанной с файлом документа.

0 голосов
/ 06 февраля 2012

Для этого вам нужен поток. Смотрите здесь: http://msdn.microsoft.com/en-us/library/y6h8hye8(v=vs.80).aspx В настоящее время вы пишете свой код в «основном потоке» (который обычно также является кодом вашего фрейма).Таким образом, если вы запустите что-то, что требует времени, чтобы завершить, это остановит выполнение вашего основного потока, если вы запустите это во втором потоке, ваш основной поток продолжит.

Обновление: я пропустилчасть, которую вы хотите выйти немедленно.execl () скорее всего то, что вам нужно.

#include <unistd.h>

int main(){

    execl("C:\\path\\to\\updater.exe", (const char *) 0);
    return 0;
}

Предложенный CreateProcess () также может быть использован, но execl соответствует POSIX и сделает ваш код более переносимым (если вам все равно).

#include <unistd.h>
extern char **environ;
int execl(const char *path, const char *arg, ...);

Обновление: протестировано на Win-7 с использованием gcc в качестве компилятора

...