【问题标题】:MFC appending text to Rich Edit Box from threadMFC 将文本从线程附加到 Rich Edit Box
【发布时间】:2019-04-16 21:40:30
【问题描述】:

我正在尝试在整个程序中创建某种日志记录系统,我可以从线程中将文本添加到 GUI 中的丰富编辑框。我对这个堆栈不是很熟悉,但是从阅读中意识到你无法访问函数并且必须使用控制消息来执行此操作。

我正在尝试这样的事情:

CString ExampleMessage("hi");
HWND hEdit = GetDlgItem (m_pMainWnd->GetSafeHwnd(),IDC_RICHEDIT22);
int ndx = GetWindowTextLength (hEdit);
SetFocus (hEdit);
SendMessage (hEdit, EM_SETSEL, (WPARAM)ndx, (LPARAM)(LPCTSTR)ExampleMessage );

但是似乎没有消息出现。有没有办法在线程中获取 CRichEditCtrl 及其底层函数?我假设不是。

谢谢!

【问题讨论】:

标签: c++ mfc


【解决方案1】:

您只想从一个线程执行此操作(至少在任何时候)。原因很简单:您必须(至少)向控件发送两条消息以提供一些文本(一条用于设置当前选择,另一条用于将选择替换为一些文本)。

如果两个(或更多)线程尝试同时执行此操作,您将很快遇到竞争条件。它们取决于在设置选择和替换选择之间保持相同的选择。如果不这样做,结果将不会如预期的那样(并且如果多个线程尝试同时执行此操作,它将不会保持不变)。

您想选择一个线程来拥有该控件。其他线程可以将他们的文本片段发送到所属线程,并让它将文本添加到控件中。

理论上,您可以使用互斥锁来保护控件,因此一次只能有一个线程可以修改它。这当然可以,但至少在大多数情况下,与仅将文本传递给单个线程相比,它几乎没有(如果有的话)。

【讨论】:

  • 值得注意的是,跨线程发送消息在技术上是安全的。消息在所属线程上分派和处理。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-07
  • 1970-01-01
  • 2023-03-11
  • 2012-07-21
相关资源
最近更新 更多