2010-01-21 75 views
1

我有典型的聊天應用程序。聊天應用程序,如何避免混淆輸出

客戶端是使用兩個線程實現的。

線程1

do { 

show menu 
read option 
case option 
    1: option1 
    2: option2 
    . 
    . 
    . 
    5:end 
    end case 
while (!end) 

線程2:

do { 

read message from socket 
display message 
while (!end) 

的一個問題是線程1是快,所以處理。第選項後,它再次顯示線程2之前的菜單可以顯示它的消息。 我已經解決了這個問題,把Thread1睡了1000毫秒,但不知道是否有更好的方法來做到這一點。

另一個是:當客戶端什麼都不做時,屏幕上只有一條消息,要求處理一個選項。如果另一個客戶端向他發送了一條消息,則此消息在Promt之後顯示,因此信息很混亂:這是客戶端從另一個客戶端收到消息後會看到的內容的示例。

1.- Print users conected 
2.- Send message to all 
3.- Send message to a user 
4.- Quit 
Choose an option: Message received from user "david": hello! 

有什麼辦法可以解決這個問題嗎?

+1

什麼是您的用戶界面?從描述中可以看出它可能是基於控制檯的。編輯:顯然是如此。 – Dan 2010-01-21 23:31:31

+0

上週我遇到了這個問題,當時我還在試驗。只需使用swing創建或借用一個簡單的gui。有一個用於顯示文本的框和一個用於發送文本的框。 GL – 2010-01-21 23:57:52

+0

是的界面是基於控制檯的。 這是我的Java課程的應用。它會按原樣通過考試,但我希望能使其工作至少體面。 – 2010-01-22 00:41:53

回答

0

如果你的線程與管道通信,你可以讓第一個線程等待第二個線程說「我完成了」。

1

你的第一個問題可以通過線程同步來解決。這是一個沉重的主題,但線程一般如此振奮自己的一些學習

線程1
等待用戶做出選擇
用戶做出選擇
過程 - >通知的處理
等待線程2線程2是確定
等待用戶作出chocie

線程2
等待處理從線程1
經由套接字發送數據 通知線程1它沒事
等待線程1處理

你的第二個問題可以用gui來解決。沒有太多基於控制檯的聊天程序,這是有原因的。 unix系統有ncurses來處理控制檯中的文本定位,但windows只有ncurses相當於hacks。您可能想查看它

+0

我嘗試了同步,但不確定是否同步,並等待()和通知()主題的正確工具。 稍後我會嘗試GUI方法,但我只是好奇,看看是否有什麼東西可以解決這個問題。 – 2010-01-22 00:45:08