2009-07-29 4 views
0

현재 내 소켓에서 읽은 데이터를 표시하려고하면 GUI가 멈 춥니 다. 하나 또는 두 개의 메시지를 표시 할 때 동결하지 않습니다. 많은 메시지 (초당 2-3)를 수신 할 때만 나타납니다. 비동기 소켓 (비 차단)을 사용하고 있습니다. 나는 그것이 GUI에 데이터를 표시하는 방법과 관련이 있다고 생각합니다. 코드 : Windows Forms GUI 소켓 사용 중 고정

public class Globals 
{ 

    public static MainDialog myDialog; 
} 

public partial class MainDialog : Form 
{ 
    public MainDialog() 
    { 
     InitializeComponent(); 
     Globals.myDialog = this; 

    } 
    public void sendText(string text) 
    { 
     logBox.AppendText(text); 
     logBox.AppendText("\n"); 
    } 
} 

그럼 난 그저 내 네트워크 클래스에서 Globals.myDialog.sendText (..)로 전화하십시오. 내가 말했듯이 그것은 잘 작동하지만, 많은 메시지를 즉시받지 못한다.

누구나 아이디어가 있으십니까?

답변

0

다른 스레드에서 gui 컨트롤에 대한 업데이트를 호출 할 때 InvokeRequired를 확인하십시오.

+0

감사합니다. 잘 작동합니다. :) –

+0

전에도 이걸 가지고 있었으면, 빨리 재산을 찾아야 만했습니다. X-) –

2

코드를 보면 제 생각에 소켓에서 데이터를 읽는 네트워크 클래스가 별도의 스레드에 있지 않습니다. BackgroundWorker 클래스를 사용하여 소켓 데이터를 실행 한 다음 ProgressChanged를 호출하여 데이터를 다시 GUI로 가져옵니다. Here은 JobWorker를 설정하여 작업을 실행하고 GUI를 설정하는 좋은 예입니다.

+0

비동기는 스레딩을 수행하므로 별도의 스레드입니다. 아직도 고마워, 나는 InvokeRequired & BeginInvoke를 사용하여 그것을 고쳤다. –

+0

당신이 BackgroundWorker를 사용한다면, InvokeRequired가 필요합니다. 당신을 위해 그것을 처리합니다. – SwDevMan81

+0

나중에 보겠습니다. 고마워요. –

0

어디서나 네트워크 코드를 배치 할 수 있습니다. TextBox를 여러 번 업데이트하면 인터페이스가 응답하지 않을 수 있습니다.

네트워킹 스레드에서 메시지를 버퍼링하는 대신 타이머를 사용하여 TextBox를 1 초에 한 번만 업데이트하는 방법을 생각해보십시오.

+0

InvokeRequired 및 BeginInvoke를 사용하여 수정했습니다. 감사! –