2013-06-25 4 views
1

어딘가에 서버에서 호스팅되는 PHP 스크립트에 연결하여 로그인을 시도하는 응용 프로그램에서 응용 프로그램이 예상대로 응답하지 않지만 PHP 스크립트의 연결 또는 응답에 지연이있는 경우 대기 너무 길어지고 응용 프로그램이 멈춘 것처럼 보입니다. 우리는 사용자가 생각하기를 원하지 않습니다.C++ 응용 프로그램의 로그인은 별도의 스레드에서 수행해야합니까?

목적을 위해 새 스레드를 만들고 응답이 수신 될 때까지 주 응용 프로그램의 컨트롤을 비활성화하는 것이 좋습니다.

저는 C++ 및 순수 Winapi와 libCurl 및 oop로 작업하고 있습니다.

+2

스레드를 사용하는 것은 나에게 합리적인 접근법처럼 보입니다. –

+3

콜백과 함께 비동기 I/O를 사용할 수도 있습니다. –

+1

연결에 대해 시간 초과를 설정할 수도 있습니다. 시간 초과가 만료되면 다른 시간에 시도하도록 사용자에게 조언합니다. – hetepeperfan

답변

2

메인 (GUI?) 스레드에서 시간 집약적 인 작업을해서는 안됩니다. 서버에 연결하는 것은 그런 일입니다. 비동기 IO (예 : 콜백 또는 비 블로킹 소켓)를 사용하여이 문제를 해결할 수도 있지만이 솔루션은 또 다른 스레드를 생성합니다. 다른 스레드에서 연결을하고 연결하는 동안 컨트롤을 사용하지 않도록 설정하지만 사용자에게 프로그램이 무언가 (예 : 순환 원 또는 무언가)를하고 있다고 알립니다. 프로그램이 아무 것도하지 않는 것처럼 보이면 사용자는 그것을 싫어합니다.

+0

회전 원 자체가 별도의 스레드가 필요합니까? 프로세스 중에 메인 스레드를 차단하고 연결에 시간 초과를 설정하고 회전 원 애니메이션을위한 새로운 스레드를 만드는 방법에 대해 설명합니다. 이 접근 방식의 함정은 무엇입니까? – StudentX

+0

응용 프로그램은 주 스레드에서 메시지를 처리하므로 차단하면 더 이상 작동하지 않는 것처럼 반응합니다. 예를 들어 Windows의 경우 "xy stopped responding"메시지가 표시되고 대부분의 사용자는 "기다림"대신 "강제 종료"를 클릭합니다. 주 스레드에서 (창 시스템에서 제공 한) 타이머를 사용하여 50 밀리 초마다 몇 도씩 원을 회전시키는 메서드를 호출해야합니다. – Marius

2

libcurl 멀티 인터페이스는 비동기 적으로 작업 할 수 있으므로 별도의 스레드가있는 대신 결과가 나올 때까지 curl_multi_perform() 함수를 호출해야합니다. 이상하게 보일 수도 있지만 응용 프로그램에서 스레드를 사용하지 않을 때마다 승리 할 수 ​​있습니다. 스레드 == 언젠가는 일어날 버그가 있으므로 가능하면 피하십시오. 여기에 일부입니다 basic example

관련 문제