none
生產者與消費者 RRS feed

  • 問題

  • 我想問 多執緒中的生產者消費者問題,
    如果生產者同時也是消費者該如何實作,請專家能給我提示或參考

    A 增加Queue<stirng> B拿出來decode之後做完,想要把結果或returncode 送回去,可能由另一個c去傳送出去 或是a
    這樣會有問題,希望能給我一些指導
    2009年3月9日 下午 01:21

解答

    • 已標示為解答 ericstone 2009年3月11日 上午 05:00
    2009年3月10日 上午 02:53
  • ericstone 表示:

     因為目前做socket的接收 ,用的是非同步接收
    可能會從多個client收到很多的訊息 加進去一個queue裡面 ,而另一個程式會把queue裡面的東西拿出來 拆碼完後執行,
    然後執行的結果,還要組成特定字串,用socket傳出去。
    因為我學c#不到一個月,所以流程方面不太懂,希望能給我一些提示

    我解釋一下你的意思:
    假設Server有一個Listener Socket A,負責接收來自各client的Socket B的訊息
    當Socket A接收到資料就進行內部的程序,將得到的結果回傳給Soeckt B ?
    這樣好像不用Queue吧?
    Beginaccept->BeginReceive->處理->BeginSend->結束
    • 已標示為解答 ericstone 2009年3月11日 上午 05:00
    2009年3月10日 上午 03:07
    版主

所有回覆

  • 不是很懂你想要的東西..
    可以稍微麻煩再解釋一下你想要的程序嗎?
    2009年3月10日 上午 01:42
    版主
  •  因為目前做socket的接收 ,用的是非同步接收
    可能會從多個client收到很多的訊息 加進去一個queue裡面 ,而另一個程式會把queue裡面的東西拿出來 拆碼完後執行,
    然後執行的結果,還要組成特定字串,用socket傳出去。
    因為我學c#不到一個月,所以流程方面不太懂,希望能給我一些提示
    2009年3月10日 上午 01:53
    • 已標示為解答 ericstone 2009年3月11日 上午 05:00
    2009年3月10日 上午 02:53
  • ericstone 表示:

     因為目前做socket的接收 ,用的是非同步接收
    可能會從多個client收到很多的訊息 加進去一個queue裡面 ,而另一個程式會把queue裡面的東西拿出來 拆碼完後執行,
    然後執行的結果,還要組成特定字串,用socket傳出去。
    因為我學c#不到一個月,所以流程方面不太懂,希望能給我一些提示

    我解釋一下你的意思:
    假設Server有一個Listener Socket A,負責接收來自各client的Socket B的訊息
    當Socket A接收到資料就進行內部的程序,將得到的結果回傳給Soeckt B ?
    這樣好像不用Queue吧?
    Beginaccept->BeginReceive->處理->BeginSend->結束
    • 已標示為解答 ericstone 2009年3月11日 上午 05:00
    2009年3月10日 上午 03:07
    版主
  •  我想請問socket接收的時候,我做了一個小測試
    寫了另一個form傳遞訊息,發現當我連按的時候
    server這裡收到的訊息會是  [xxxxxxx][xxxxxxx][xxxxxxx][xxxxxxxx]
    變成所以訊息加起來,表示若client連續發送不同訊息也會發生,
    我應該如何避免這種情況發生,因為這樣拆解字串 就變成無法動作
    2009年3月10日 上午 07:05
  • 因為你沒貼碼,所以只能猜猜看
    我猜你的client在發送後並沒有Close Socket,所以它Connect後一直用同一個Socket在送
    這樣也無妨,如果你要這樣做,後端加一個結尾字元
    Server端以結尾字元判斷是否是為一個命令的結尾(可以用換行之類的)
    更麻煩一點,可以連啟始字元都多加一個
    server收到後用Split之類的把字串分開就好
    (PS:因為看起來你Encoding是ASCII的樣子)

    2009年3月10日 上午 07:52
    版主
  • 恩 我看了一下我測試的form,真的沒有close
    所以發送訊息 送完就close ,送之前在beginConnect
    我想請問 那我要如何正確傳送給client 結果,而不會傳送錯誤
    因為我接收-->處理---> 傳回這段該如何傳回答案給發問的client呢?
    如果是本機多個不同程式之間的溝通

    2009年3月10日 上午 08:00
  •  你的Client如果還要等待接收結果,那就必須在EndReceive之後再關掉Socket
     如果你的程式會有這麼多東西會傳來傳去, 建議在做非同步呼叫的時候建一個AsyncState Object把這些資訊包起來
     看起來你以Socket為基礎溝通,是不是本機沒差吧.
     在本機的狀態,你還是用Client Socket丟給Listener Socket,所以還是視為兩個不同的Socket個體
     
    2009年3月10日 上午 08:46
    版主
  • 恩 我會試試看
    請問因為我處理是丟給threadpool ,threadpool不能帶結果
    我也不知道那個做完了,結果要怎麼做 才能取出來 send
    2009年3月10日 上午 09:15
  • 你是BeginReceive-->收到東西--->丟進ThreadPool-->處理-->用Beginsend回傳?
    ThreadPool.QueueUserWorkItem有兩個多載啊
    其中一個有帶State Object
    ThreadPool.QueueUserWorkItem 方法 (WaitCallback, Object)
    用這個就可以把Sokect資料傳給ThreadPool啊
    2009年3月10日 上午 09:24
    版主

  • ThreadPool.QueueUserWorkItem 方法 (處理方法, Object)
    我的問題是,當方法被執行緒執行時,方法裡面是搬檔案,
    我不知道該如何取出裡面的結果 是不是有搬成功或是檔案不存在
    好讓我去send這些結果給client
    真是感謝你的熱心,回答我這麼多,都非常的對我有幫助
    2009年3月10日 上午 09:30
  • 你把Socket資訊包進State Object傳給ThreadPool
    你的threadPool一定有執行某個Sub,假設叫Test好了
    既然你把Socket的資訊傳給Test
    那你就在Test Sub裡去呼叫BeginSend
    2009年3月10日 上午 10:09
    版主
  •  哦!在裡面做beginsend,原來你是這個意思
    我知道了,如果還想要在listview上顯示呢? 這部份可能嗎?
    因為我試了都顯示不出來
    2009年3月10日 上午 10:54
  • 子執行緒要把資料顯示在主執行緒的控制項物件要用Invok呼叫方法
    因為子執行緒不能直接控制主執行緒的控制項
    MSDN中有一些參考
    Control.InvokeRequired 屬性
    http://msdn.microsoft.com/zh-tw/library/system.windows.forms.control.invokerequired(VS.80).aspx

    HOW TO:使用背景執行緒搜尋檔案
    http://msdn.microsoft.com/zh-tw/library/3s8xdz5c(VS.80).aspx

    論壇有一篇討論這個,寫的很清楚
    Thread 與 Static
    http://social.msdn.microsoft.com/Forums/zh-TW/233/thread/09dd6911-2539-403f-8a30-c5f837098b74/

    給您參考
    2009年3月10日 上午 11:11
    版主
  •  ThreadPool.QueueUserWorkItem(方法)
    方法我是用class.方法,我使用委派時,表單的控制項不會更新
    而且listview.InvokeRequired 都是false的狀態
    我的類別繼承form1,也是不能更新,是因為只要form1 form =new form1
    就是一個新的視窗,變成無法指個原本的contrl ?
    2009年3月10日 下午 02:17
  • 你是說你有一個類別假設叫Proc,其中有一個方法叫Test,你用這個方法去處理資訊?
    所以程式是
    ThreadPool.QueueUserWorkItem(New WaitCallback(AddressOf Proc.Test))
    我沒這樣寫過,只能想像一下,而且我只會用笨方法
    可以改成

    ThreadPool.QueueUserWorkItem(New WaitCallback(AddressOf Test2))

    在From1建立Test2 Sub
    Private Sub Test2
         回傳值=Proc.Test
         在此用回傳值做Invoke
    End Sub
    2009年3月11日 上午 01:04
    版主