想實作的功能:從串口讀取資料,當讀到資料后在主視窗的lable1標簽中進行顯示。
我的思路:在主視窗初始化之前,開了一個執行緒監聽串口并讀取資料,讀取到資料后修改form1類lable1標簽的Text值。我用label1->Text、form1.label1->Text、form1->label1->Text都不行。我已經在form1類中將lable1改成public了,我知道問題應該是在lable1的左邊需要明確指出視窗名,但是怎么才能找到這個主視窗的實體名或者是句柄。自動生成的代碼中也沒有定義form1類實體的地方,就一條Application::Run(gcnew Form1());。還有另一種解決思路,執行緒收到資料后向form1類發送一個訊息,然后form1類去定義訊息處理函式來修改lable1,但是這中方法我根本沒有找到訊息佇列的地方,vs生成的代碼中就沒有看見訊息處理的相關代碼。這個代碼封裝到哪里去了。現在的問題是編譯通不過,程式中我會加判斷代碼主視窗知否已經初始化完成了,所以不用擔心修改在主視窗初始化之前。
我沒搞懂的主要3個方面:
問題1:如何找到主視窗的實體名或者句柄
問題2:這種vs自動生成的form程式,如何自定義訊息及處理函式
問題3:在類的初始化函式中是否可以開啟一個執行緒,用于控制該類的相關屬性。這個回呼函式應該怎么定義,我嘗試過定義為類的成員函式執行緒開始代碼編譯通不過,定義為static函式又不能直接參考控制元件。
請大神們幫幫忙
```
//new_form.cpp
#include "stdafx.h"
#include "Form1.h"
#include<iostream>
#include<fstream>
#include <process.h>
using namespace std;
using namespace new_form;
unsigned int _stdcall ListenThread(void* pParam) ;
[STAThreadAttribute]
int main(array<System::String ^> ^args)
{
volatile HANDLE m_hListenThread= INVALID_HANDLE_VALUE;
unsigned int threadId;
m_hListenThread = (HANDLE)_beginthreadex(NULL, 0, ListenThread, NULL, 0, &threadId);//開啟監聽執行緒
// 在創建任何控制元件之前啟用 Windows XP 可視化效果
Application::EnableVisualStyles();
Application::SetCompatibleTextRenderingDefault(false);
// 創建主視窗并運行它
Application::Run(gcnew Form1());
return 0;
}
unsigned int _stdcall ListenThread(void* pParam)
{
label1->Text="有資料需要顯示!";
}
```
頭檔案
```
//form1.h
#pragma once
#pragma comment(lib,"User32.lib")
#include<windows.h>
#include<iostream>
#include<string>
#include <process.h>
using namespace std;
using namespace System::Runtime::InteropServices;
namespace new_form {
using namespace System;
using namespace System::ComponentModel;
using namespace System::Collections;
using namespace System::Windows::Forms;
using namespace System::Data;
using namespace System::Drawing;
/// <summary>
/// Form1 摘要
/// </summary>
public ref class Form1 : public System::Windows::Forms::Form
{
public:
Form1(void)
{
InitializeComponent();
}
protected:
/// <summary>
/// 清理所有正在使用的資源。
/// </summary>
~Form1()
{
if (components)
{
delete components;
}
}
public: System::Windows::Forms::Label^ label1;
private:
/// <summary>
/// 必需的設計器變數。
/// </summary>
System::ComponentModel::Container ^components;
#pragma region Windows Form Designer generated code
/// <summary>
/// 設計器支持所需的方法 - 不要
/// 使用代碼編輯器修改此方法的內容。
/// </summary>
void InitializeComponent(void)
{
this->label1 = (gcnew System::Windows::Forms::Label());
this->SuspendLayout();
// label1
//
this->label1->Font = (gcnew System::Drawing::Font(L"宋體", 36, System::Drawing::FontStyle::Regular, System::Drawing::GraphicsUnit::Point,
static_cast<System::Byte>(134)));
this->label1->Location = System::Drawing::Point(30, 85);
this->label1->Name = L"label1";
this->label1->Size = System::Drawing::Size(559, 47);
this->label1->TabIndex = 19;
this->label1->Text = L"默認顯示內容:";
this->label1->Click += gcnew System::EventHandler(this, &Form1::label1_Click);
//
// Form1
//
this->AutoScaleDimensions = System::Drawing::SizeF(6, 12);
this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
this->ClientSize = System::Drawing::Size(623, 340);
this->Controls->Add(this->label1);
this->ForeColor = System::Drawing::Color::CornflowerBlue;
this->Name = L"Form1";
this->StartPosition = System::Windows::Forms::FormStartPosition::CenterScreen;
this->Text = L"呼叫器";
this->Load += gcnew System::EventHandler(this, &Form1::Form1_Load);
this->ResumeLayout(false);
this->PerformLayout();
}
#pragma endregion
};
}
```
uj5u.com熱心網友回復:
在Form中打開串口及其執行緒是不是更容易 https://www.cnblogs.com/bacazy/p/3500117.htmluj5u.com熱心網友回復:
你給的例子是點一下按鈕再去接收資料,我是需要實時監控串口,一有資料馬上處理,所以必須要單獨開一個執行緒回圈檢測。我串口操作這塊是沒有問題的,我的問題是在收到資料后處理這塊,我需要在子執行緒中去修改主視窗的控制元件屬性。他這個主視窗是個Form1類,實體還是托管的,我試過在視窗的建構式中通過this指標傳遞給全域變數,說托管類不允許這么操作。我把ref去掉錯誤更多。在Form1類中的成員函式都可以直接改控制元件屬性,但只要開執行緒就不行,開執行緒就必須定義成靜態函式,只要是靜態函式,即便是我通過指標找到這個視窗了,他都不允許我改,說是托管的。把我折騰夠了。
uj5u.com熱心網友回復:
SerialPort.DataReceived Eventuj5u.com熱心網友回復:
等到視窗創建再開你的執行緒然后你就可以把視窗句柄傳給執行緒
在執行緒里你可以給視窗發訊息。
uj5u.com熱心網友回復:
我試過在視窗建構式中開起執行緒,有一個問題是回呼函式的引數是void*
uj5u.com熱心網友回復:
而視窗類指標不能定義成Form1*,他只允許定義為Form1 ^,在回呼函式的實作中強制轉換引數型別會出錯。
uj5u.com熱心網友回復:
沒叫你傳視窗,自己宣告個結構體。uj5u.com熱心網友回復:
只想說,版主說的對轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/55888.html
標籤:基礎類
