2013-06-25 5 views
1

Когда приложение, пытающееся войти в систему, подключившись к скрипту php, размещенному где-то на сервере, приложение перестает отвечать на запросы, что следует ожидать, но если есть некоторая задержка в соединении или ответе от скрипта php, ожидание становится слишком длинным и выглядит так, как приложение повешено, что мы не хотим, чтобы наш пользователь думал.Должен ли вход в приложение C++ выполняться в отдельном потоке?

Так что это хорошая идея создать новую цепочку только для этой цели и просто отключить элементы управления основного приложения до получения ответа?

Я работаю на C++ и чистом Winapi вместе с libCurl и oop.

+2

Использование нити кажется разумным подходом ко мне. –

+3

Вы также можете использовать асинхронный ввод-вывод с обратными вызовами. –

+1

Вы также можете сделать тайм-аут в соединении, и если истечет время ожидания, попросите пользователя попробовать в другое время. – hetepeperfan

ответ

2

Вы не должны делать (подкрепляемые) трудоемкие задачи в своем главном (GUI?) - Thread. Подключение к серверам - это такая вещь. Вы, вероятно, обойдете его, используя асинхронный ввод-вывод (например, обратные вызовы или неблокирующие сокеты), но эти решения также просто порождают для вас другой поток. Сделайте свое соединение в другом потоке и отключите элементы управления во время соединения, но сообщите пользователю, что программа что-то делает (например, вращающимся кругом или чем-то еще). Пользователи ненавидят его, когда программы, похоже, ничего не делают.

+0

Вращающийся круг сам по себе нуждается в отдельной теме? Как насчет того, чтобы основной поток был заблокирован во время процесса, поставив тайм-аут на соединение и создав новый поток для анимации вращающегося круга? Каковы подводные камни этого подхода? – StudentX

+0

Приложение обрабатывает свои сообщения в основном потоке, поэтому, если вы заблокируете его, он все равно будет реагировать так, как будто он больше не работает. В Windows, например, будет сообщение «xy перестало отвечать», и большинство пользователей нажимают «принудительно закрыть» вместо «ждать его». Вы должны использовать таймер (с помощью оконной системы) в своем основном потоке, который вызывает метод, который вращает круг на несколько градусов каждые 50 миллисекунд или около того. – Marius

2

Интерфейс libcurl multi имеет возможность работать асинхронно, поэтому вместо отдельного потока вам придется вызвать функцию curl_multi_perform(), пока не получите результат. Это может показаться странным, но каждый раз, когда вы можете избежать использования потоков в своем приложении, вы выигрываете. Темы == Ошибки, которые когда-нибудь произойдут, поэтому, если это возможно, избегайте их. Вот некоторые basic example