主頁 > 軟體工程 > 請問高手, 主界面如何向作業執行緒發送資料

請問高手, 主界面如何向作業執行緒發送資料

2020-09-12 16:05:42 軟體工程

我做了一個界面,通過界面按鈕向作業執行緒發送結構體資料(就是位置坐標)。作業執行緒接收到資料,將資料通過TCPIP協議發送到樹莓派,同時樹莓派將采集到的資料通過TCPIP協議發送到作業執行緒,作業執行緒再將資料顯示主界面

uj5u.com熱心網友回復:

PostThreadMessage ? 

uj5u.com熱心網友回復:

共享記憶體或者視圖PostThreadMessage,如果使用前者,要注意同步

uj5u.com熱心網友回復:

typedef struct  MoveCmd   // 坐標命令結構體
 {

 float position_x;

 float position_y;

 int execute_cmd[512];

 }  MoveCmd;

 MoveCmd *moveCmd;

::PostThreadMessageA(m_pThread->m_nThreadID,WM_CMD_MSG,0,0);

LRESULT CMFC_TCP_IPDlg::TransCommand(WPARAM wParam, LPARAM lParam)   // 訊息回應函式


}


UINT ThreadFunction(LPVOID pParam); 
{
}
但是使用PostThreadMessageA 函式只是執行訊息處理函式,那怎么把資料傳送到作業執行緒執行函式中去。
高手能說的詳細點嗎

uj5u.com熱心網友回復:

我想通過按鈕更新 作業執行緒中的資料

uj5u.com熱心網友回復:

全域變數   靜態變數   共享記憶體  管道  ……

uj5u.com熱心網友回復:

以前做下載進度顯示用的是全域變數,反正能實作。不過總感覺用全域變數不太好

uj5u.com熱心網友回復:

Multiple Threads in the User Interface http://msdn.microsoft.com/zh-cn/library/ms810439.aspx

uj5u.com熱心網友回復:

SetEvent + WaitForSingleObject ?

uj5u.com熱心網友回復:

 unsigned int CMFC_TCP_IPDlg::Server_Thread(LPVOID pParam)
{

CMFC_TCP_IPDlg *pDlg = (CMFC_TCP_IPDlg *)pParam;  // 將執行緒指標強制轉化為CMFC_TCP_IPDlg型別指標

MSG msg;

// tagRun=0;
// 將發送緩沖區和接識訓沖區清零
memset(sendBuf,0,sizeof(sendBuf));
memset(recvBuf,0,sizeof(recvBuf));
/********************************************************************************************/
struct MoveCmd *cmdData=https://bbs.csdn.net/topics/new(MoveCmd); // 執行緒要處理的資料

memset(cmdData,0,sizeof(cmdData));

while(::PeekMessageA(&msg,NULL,0,0,PM_REMOVE))
  {
         switch(msg.message)
 {
 case WM_QUIT://退出從執行緒
   break;
             ExitThread(10);
 case WM_CMD_MSG:
// AfxMessageBox("接收訊息成功");
          cmdData = (MoveCmd*)msg.wParam;
              break;         

 default: 
  break;
 }
       

 }

/***************************************** 加載套接字庫************************************/
WORD wVersion;    // 存盤套接字版本

wVersion=MAKEWORD(1,1); // 保存WinSock庫版本號。不是C++標準的型別,是微軟SDK中的型別,WORD的意思為字,是2byte(16位)的無符號整數,表示范圍0~65535.  

WSADATA wsaData;  //存放windows socket初始化資訊

WSAStartup(wVersion,&wsaData);  //加載套接字庫,成功回傳0  
  
    if(LOBYTE(wsaData.wVersion)!=1||HIBYTE(wsaData.wVersion)!=1) //判斷wsaData.wVersion低位元組和高位元組是否都為1,若版本不對應,呼叫WSACleanup函式終止對Socket的使用  
    {  
        WSACleanup();        
    }  



//-------創建用于監聽的套接字-----------//
if ((sockSrv = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET)   //  創建通信端點:  sockSrv 回傳套接字描述符 
    {
         ::SetWindowText(::GetDlgItem(pDlg->m_hWnd, IDC_EDIT2), "創建監聽套接字失敗");   
    }
else
{
         ::SetWindowText(::GetDlgItem(pDlg->m_hWnd, IDC_EDIT2), "創建監聽套接字成功"); // 獲得視窗的句柄
}



//--------系結套接字----------//  

    SOCKADDR_IN addrSrv;  // 服務器端地址結構體變數   typedef sockaddr_in  SOCKADDR_IN

memset(&addrSrv,0,sizeof(addrSrv)); // 清空結構體

addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);  // //將IP地址指定為INADDR_ANY,允許套接字向任何分配給本地機器的IP地址發送或接收資料。當有多個網卡多個IP,使用INADDR_ANY可以簡化編程  
// addrSrv.sin_addr.S_un.S_addr=inet_addr(serverIP); //系結本地IP

addrSrv.sin_family=AF_INET;       // 設定家族簇

addrSrv.sin_port=htons(Port_num);  // 系結埠號

// addrSrv.sin_zero[8]=0;

/* 捆綁sockfd描述符   指定本地地址──bind()  當一個套接字用socket()創建后,存在一個名字空間  (地址族), 但它沒有被命名。bind()將套接字地址(包括  本地主機地址和本地埠地址)與所創建的套接字號  聯系起來,即將名字賦予套接字,以指定本地半相關。   */  

if(SOCKET_ERROR==bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR))) 
{
::SetWindowText(::GetDlgItem(pDlg->m_hWnd, IDC_EDIT2), "系結錯誤");  
}
else
{
// ::SetWindowText(::GetDlgItem(pDlg->m_hWnd, IDC_EDIT2),  "系結成功"); 
pDlg->SetDlgItemText(IDC_EDIT2,"系結成功");

}

//-------將套接字設為監聽模式,準備接收客戶端請求------- //
listen(sockSrv,2); //引數(套接字描述符,backlog這里是2(等待連接佇列的最大長度))

//用來接收客戶端的地址資訊
SOCKADDR_IN addrClient;  // typedef sockaddr_in addrClient

memset(&addrClient,0,sizeof(addrClient)); // 清空結構體

int iaddrSize=sizeof(SOCKADDR);  // 對accept的第三個函式來說,在呼叫之前必須為它賦予一個初始值,即SOCKADDR_IN


 
// while(1)
// {
 

sockConn = accept(sockSrv, (struct sockaddr *)&addrClient, &iaddrSize);

if ( sockConn==INVALID_SOCKET  )  // WSASetLastError()
    {
       ::SetWindowText(::GetDlgItem(pDlg->m_hWnd, IDC_EDIT2), "未連接到客戶端"); 
   char err[128];

   itoa(INVALID_SOCKET ,err,10);
   ::SetWindowText(::GetDlgItem(pDlg->m_hWnd, IDC_EDIT4), itoa(INVALID_SOCKET,err,10)); 
    }
else
{

//    ::SetWindowText(::GetDlgItem(pDlg->m_hWnd, IDC_EDIT2), "已連接客戶端"); 
pDlg->SetDlgItemText(IDC_EDIT3,"已連接客戶端");
    }

       //******************* 發送資料********************//  
memset(moveCmd,0,sizeof(MoveCmd)); // 清空moveCmd結構體
// 結構體賦值
moveCmd->position_x=200.0;
moveCmd->position_y=400.0;

  memcpy(sendBuf,moveCmd,sizeof(MoveCmd));
      nSize=send(sockConn,sendBuf,100,0);  // 注意發送和接受的第一個引數:應該是accept()回傳的客戶端的套接字描述符
 if(-1==nSize)
  {
        
       ::SetWindowText(::GetDlgItem(pDlg->m_hWnd, IDC_EDIT8), "發送資料失敗");
  }
 else
 {
   char err[128];

   itoa(nSize ,err,10);
   ::SetWindowText(::GetDlgItem(pDlg->m_hWnd, IDC_EDIT8), itoa(nSize,err,10)); 
 
 }

//  ::SetWindowText(::GetDlgItem(pDlg->m_hWnd, IDC_EDIT4), sendBuf);
//  ::PostMessage(pDlg->m_hWnd, WM_CMD_MSG, 0, 0);  

             //******************* 接收資料********************//

 
int recv_size= recv(sockConn,recvBuf,strlen(recvBuf)+1,0);
 if(SOCKET_ERROR==recv_size)
 {
   ::SetWindowText(::GetDlgItem(pDlg->m_hWnd, IDC_EDIT3), "接收錯誤");
     char err[128];

   itoa(SOCKET_ERROR ,err,10);
   ::SetWindowText(::GetDlgItem(pDlg->m_hWnd, IDC_EDIT7), itoa(SOCKET_ERROR,err,10)); 

 }

 else
 {
     ::SetWindowText(::GetDlgItem(pDlg->m_hWnd, IDC_EDIT4), recvBuf);
 }

我與客戶端連接成功了,但是我發送的資料為什么顯示發送失敗呢,接收資料也是那樣,我檢查了好幾天,都沒把問題解決,麻煩高手指導一下

uj5u.com熱心網友回復:

雖然我不太懂,但是我推薦一個講的特別好的:https://blog.csdn.net/qq61394323/article/details/25334293
按照這個做應該沒有太大問題

uj5u.com熱心網友回復:

把視窗指標直接傳到執行緒里面不就行了

uj5u.com熱心網友回復:

據說,執行緒開啟的時候,把視窗的指標也傳過去,那么執行緒就可以直接訪問視窗的變數

uj5u.com熱心網友回復:

iocp訊息佇列?

uj5u.com熱心網友回復:

在執行緒創建初就把類實體句柄傳進去不就好了嗎,之后再執行緒回圈中直接讀類物件的屬性或呼叫類函式就可以得到相關東西啦。
比如創建執行緒時傳遞個this進去

...
this->m_threadhandle = CreateThread(&thread_sa,0,(LPTHREAD_START_ROUTINE)OnConnectThread,(LPVOID)this,0,&(this->m_threadid));
...

然后在執行緒里可以重現類物件,如

DWORD SKTCPClient::OnConnectThread(LPVOID pParam)
{

SKTCPClient *obj_this = (SKTCPClient *)pParam;
int m_socket = obj_this->getSocket();
//...
return 0;
}

uj5u.com熱心網友回復:

使用快取佇列

uj5u.com熱心網友回復:

作業者 執行緒 無 訊息佇列 !

uj5u.com熱心網友回復:

postmessage是作業執行緒向主執行緒發送訊息,主執行緒向作業執行緒發送訊息模仿postmessage即可了,給一個標記位,作業執行緒監聽這個標記位即可,另外樹莓派用在工業上差了點吧?

uj5u.com熱心網友回復:

主執行緒向作業執行緒發送訊息用 Event

uj5u.com熱心網友回復:

if (BytesWritten>0)
{ // writting OK tell main to show
ResetEvent(pDload->m_hPostEventWrite);// first reset 
BOOL posted=pDload->PostMessage(WM_COMMNOTIFY,
                (WPARAM)1,        // "WatchWrite"
        MAKELONG(BytesWritten,BlockCount));
// wait answer
WaitForSingleObject(pDload->m_hPostEventWrite,0xFFFFFFFF);
}

uj5u.com熱心網友回復:

我猜想你是做多機器人專案,我也是做這個的,用UDP通訊,實作方法是在執行緒中直接訪問主行程,this->x = theApp.ui.x; 要注意執行緒同步和執行緒互斥。

轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/15255.html

標籤:界面

上一篇:自定義控制元件只能相應滑鼠左鍵按下,不能相應抬起

下一篇:【求助帖】VS2019中,怎么把c++驅動程式轉成KMDF檔案

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • Git本地庫既關聯GitHub又關聯Gitee

    創建代碼倉庫 使用gitee舉例(github和gitee差不多) 1.在gitee右上角點擊+,選擇新建倉庫 ? 2.選擇填寫倉庫資訊,然后進行創建 ? 3.服務端已經準備好了,本地開始作準備 (1)Git 全域設定 git config --global user.name "成鈺" git c ......

    uj5u.com 2020-09-10 05:04:14 more
  • CODING DevOps 代碼質量實戰系列第二課,相約周三

    隨著 ToB(企業服務)的興起和 ToC(消費互聯網)產品進入成熟期,線上故障帶來的損失越來越大,代碼質量越來越重要,而「質量內建」正是 DevOps 核心理念之一。**《DevOps 代碼質量實戰(PHP 版)》**為 CODING DevOps 代碼質量實戰系列的第二課,同時也是本系列的 PHP ......

    uj5u.com 2020-09-10 05:07:43 more
  • 推薦Scrum書籍

    推薦Scrum書籍 直接上干貨,推薦書籍清單如下(推薦有順序的哦) Scrum指南 Scrum精髓 Scrum敏捷軟體開發 Scrum捷徑 硝煙中的Scrum和XP : 我們如何實施Scrum 敏捷軟體開發:Scrum實戰指南 Scrum要素 大規模Scrum:大規模敏捷組織的設計 用戶故事地圖 用 ......

    uj5u.com 2020-09-10 05:07:45 more
  • CODING DevOps 代碼質量實戰系列最后一課,周四發車

    隨著 ToB(企業服務)的興起和 ToC(消費互聯網)產品進入成熟期,線上故障帶來的損失越來越大,代碼質量越來越重要,而「質量內建」正是 DevOps 核心理念之一。 **《DevOps 代碼質量實戰(Java 版)》**為 CODING DevOps 代碼質量實戰系列的最后一課,同時也是本系列的 ......

    uj5u.com 2020-09-10 05:07:52 more
  • 敏捷軟體工程實踐書籍

    Scrum轉型想要做好,第一步先了解并真正落實Scrum,那么我推薦的Scrum書籍是要看懂并實踐的。第二步是團隊的工程實踐要做扎實。 下面推薦工程實踐書單: 重構:改善既有代碼的設計 決議極限編程 : 擁抱變化 代碼整潔代碼 程式員的職業素養 修改代碼的藝術 撰寫可讀代碼的藝術 測驗驅動開發 : ......

    uj5u.com 2020-09-10 05:07:55 more
  • Jenkins+svn+nginx實作windows環境自動部署vue前端專案

    前面文章介紹了Jenkins+svn+tomcat實作自動化部署,現在終于有空抽時間出來寫下Jenkins+svn+nginx實作自動部署vue前端專案。 jenkins的安裝和配置已經在前面文章進行介紹,下面介紹實作vue前端專案需要進行的哪些額外的步驟。 注意:在安裝jenkins和nginx的 ......

    uj5u.com 2020-09-10 05:08:49 more
  • CODING DevOps 微服務專案實戰系列第一課,明天等你

    CODING DevOps 微服務專案實戰系列第一課**《DevOps 微服務專案實戰:DevOps 初體驗》**將由 CODING DevOps 開發工程師 王寬老師 向大家介紹 DevOps 的基本理念,并探討為什么現代開發活動需要 DevOps,同時將以 eShopOnContainers 項 ......

    uj5u.com 2020-09-10 05:09:14 more
  • CODING DevOps 微服務專案實戰系列第二課來啦!

    近年來,工程專案的結構越來越復雜,需要接入合適的持續集成流水線形式,才能滿足更多變的需求,那么如何優雅地使用 CI 能力提升生產效率呢?CODING DevOps 微服務專案實戰系列第二課 《DevOps 微服務專案實戰:CI 進階用法》 將由 CODING DevOps 全堆疊工程師 何晨哲老師 向 ......

    uj5u.com 2020-09-10 05:09:33 more
  • CODING DevOps 微服務專案實戰系列最后一課,周四開講!

    隨著軟體工程越來越復雜化,如何在 Kubernetes 集群進行灰度發布成為了生產部署的”必修課“,而如何實作安全可控、自動化的灰度發布也成為了持續部署重點關注的問題。CODING DevOps 微服務專案實戰系列最后一課:**《DevOps 微服務專案實戰:基于 Nginx-ingress 的自動 ......

    uj5u.com 2020-09-10 05:10:00 more
  • CODING 儀表盤功能正式推出,實作作業資料可視化!

    CODING 儀表盤功能現已正式推出!該功能旨在用一張張統計卡片的形式,統計并展示使用 CODING 中所產生的資料。這意味著無需額外的設定,就可以收集歸納寶貴的作業資料并予之量化分析。這些海量的資料皆會以圖表或串列的方式躍然紙上,方便團隊成員隨時查看各專案的進度、狀態和指標,云端協作迎來真正意義上 ......

    uj5u.com 2020-09-10 05:11:01 more
最新发布
  • windows系統git使用ssh方式和gitee/github進行同步

    使用git來clone專案有兩種方式:HTTPS和SSH:
    HTTPS:不管是誰,拿到url隨便clone,但是在push的時候需要驗證用戶名和密碼;
    SSH:clone的專案你必須是擁有者或者管理員,而且需要在clone前添加SSH Key。SSH 在push的時候,是不需要輸入用戶名的,如果配置... ......

    uj5u.com 2023-04-19 08:41:12 more
  • windows系統git使用ssh方式和gitee/github進行同步

    使用git來clone專案有兩種方式:HTTPS和SSH:
    HTTPS:不管是誰,拿到url隨便clone,但是在push的時候需要驗證用戶名和密碼;
    SSH:clone的專案你必須是擁有者或者管理員,而且需要在clone前添加SSH Key。SSH 在push的時候,是不需要輸入用戶名的,如果配置... ......

    uj5u.com 2023-04-19 08:35:34 more
  • 2023年農牧行業6大CRM系統、5大場景盤點

    在物聯網、大資料、云計算、人工智能、自動化技術等現代資訊技術蓬勃發展與逐步成熟的背景下,數字化正成為農牧行業供給側結構性變革與高質量發展的核心驅動因素。因此,改造和提升傳統農牧業、開拓創新現代智慧農牧業,加快推進農牧業的現代化、資訊化、數字化建設已成為農牧業發展的重要方向。 當下,企業數字化轉型已經 ......

    uj5u.com 2023-04-18 08:05:44 more
  • 2023年農牧行業6大CRM系統、5大場景盤點

    在物聯網、大資料、云計算、人工智能、自動化技術等現代資訊技術蓬勃發展與逐步成熟的背景下,數字化正成為農牧行業供給側結構性變革與高質量發展的核心驅動因素。因此,改造和提升傳統農牧業、開拓創新現代智慧農牧業,加快推進農牧業的現代化、資訊化、數字化建設已成為農牧業發展的重要方向。 當下,企業數字化轉型已經 ......

    uj5u.com 2023-04-18 08:00:18 more
  • 計算機組成原理—存盤器

    計算機組成原理—硬體結構 二、存盤器 1.概述 存盤器是計算機系統中的記憶設備,用來存放程式和資料 1.1存盤器的層次結構 快取-主存層次主要解決CPU和主存速度不匹配的問題,速度接近快取 主存-輔存層次主要解決存盤系統的容量問題,容量接近與價位接近于主存 2.主存盤器 2.1概述 主存與CPU的聯 ......

    uj5u.com 2023-04-17 08:20:31 more
  • 談一談我對協同開發的一些認識

    如今各互聯網公司普通都使用敏捷開發,采用小步快跑的形式來進行專案開發。如果是小專案或者小需求,那一個開發可能就搞定了。但對于電商等復雜的系統,其功能多,結構復雜,一個人肯定是搞不定的,所以都是很多人來共同開發維護。以我曾經待過的商城團隊為例,光是后端開發就有七十多人。 為了更好地開發這類大型系統,往 ......

    uj5u.com 2023-04-17 08:18:55 more
  • 專案管理PRINCE2核心知識點整理

    PRINCE2,即 PRoject IN Controlled Environment(受控環境中的專案)是一種結構化的專案管理方法論,由英國政府內閣商務部(OGC)推出,是英國專案管理標準。
    PRINCE2 作為一種開放的方法論,是一套結構化的專案管理流程,描述了如何以一種邏輯性的、有組織的方法,... ......

    uj5u.com 2023-04-17 08:18:51 more
  • 談一談我對協同開發的一些認識

    如今各互聯網公司普通都使用敏捷開發,采用小步快跑的形式來進行專案開發。如果是小專案或者小需求,那一個開發可能就搞定了。但對于電商等復雜的系統,其功能多,結構復雜,一個人肯定是搞不定的,所以都是很多人來共同開發維護。以我曾經待過的商城團隊為例,光是后端開發就有七十多人。 為了更好地開發這類大型系統,往 ......

    uj5u.com 2023-04-17 08:18:00 more
  • 專案管理PRINCE2核心知識點整理

    PRINCE2,即 PRoject IN Controlled Environment(受控環境中的專案)是一種結構化的專案管理方法論,由英國政府內閣商務部(OGC)推出,是英國專案管理標準。
    PRINCE2 作為一種開放的方法論,是一套結構化的專案管理流程,描述了如何以一種邏輯性的、有組織的方法,... ......

    uj5u.com 2023-04-17 08:17:55 more
  • 計算機組成原理—存盤器

    計算機組成原理—硬體結構 二、存盤器 1.概述 存盤器是計算機系統中的記憶設備,用來存放程式和資料 1.1存盤器的層次結構 快取-主存層次主要解決CPU和主存速度不匹配的問題,速度接近快取 主存-輔存層次主要解決存盤系統的容量問題,容量接近與價位接近于主存 2.主存盤器 2.1概述 主存與CPU的聯 ......

    uj5u.com 2023-04-17 08:12:06 more