一,让AI帮我实现程序框架

现在我们已经知道AI可以帮我做些什么了,因此在做一些小的项目的时侯,特别是如果我们并不是专业的程序员,或者我们是专业的程序员,但是因为我们不可能对所有的语言都了解,更遑论熟悉,因此在很多时候一些基础的框架,在建立过程中,就会花费巨大的精力。

在此基础上,我们可以把这一部份劳动直接扔给AI,让他们来帮我们实现跟语言相关的部分,我们主要实现业务部分。

1.基于这样的逻辑,我给AI提这样的要求:

给一个VC2019的例程:1.有菜单;2.有工具栏;3.有状态栏;4.状态栏分成3个区;5.主体为Dialog模式;6.主要窗体为一个CTabCtrl控件;7.子Tab随时增加;8.建立多线程,每一个线程对应一个Tab,以响应数据。

提出这样的要求,基本上,我们已经可以将我们的主要的人机界面构建清晰了。如果,一次讲不清楚,还可以让AI多次修改。

2.DeepSeek R1,经过几分钟思考,给出了这样的程序:

1)理清我们的要求:

好的,我现在要解决用户的问题,他需要一个使用VC2019(应该是Visual C++ 2019)创建的例程,满足以下要求:

1. 有菜单。

2. 有工具栏。

3. 有状态栏。

4. 状态栏分成3个区。

5. 主体为Dialog模式。

6. 主窗口是一个CTabCtrl控件。

7. 子Tab可以随时添加。

8. 创建多线程,每个线程对应一个Tab,用于响应数据。

2)给出实现步聚:

可能的实现步骤:

- 在对话框类中声明CTabCtrl变量,比如m_TabCtrl。

- 在OnInitDialog中初始化菜单、工具栏、状态栏,并创建初始的Tab页(如果有的话)。

- 处理菜单或工具栏的按钮点击事件,触发添加新Tab的操作。

- 添加新Tab时,动态创建对应的子对话框,并插入到Tab控件中。同时,启动一个新线程,将子对话框的句柄或指针传递给线程函数。

- 线程函数中进行数据处理,然后通过PostMessage发送自定义消息到主对话框,主对话框处理消息并更新对应的子对话框控件。

- 状态栏的三个区域可能需要定期更新,比如显示线程状态或其他信息,可以通过定时器或在线程中触发更新。

3 因为AI思维过程比较详细,这就不列举了。直接帖一些他生成的代码:

AI思维过程很详实,并且分解过程比较完备,就不列举了。这里帖一些关键代码:

1)TabThreadDemoDlg.h  
#pragma once
#include "ChildDlg.h"
#include <vector>

#define WM_UPDATE_DATA (WM_USER + 100)

struct ThreadParam {
    CChildDlg* pDlg;
    int nTabIndex;
};

class CTabThreadDemoDlg : public CDialogEx
{
// 构造
public:
    CTabThreadDemoDlg(CWnd* pParent = nullptr);

// 对话框数据
#ifdef AFX_DESIGN_TIME
    enum { IDD = IDD_TABTHREADDEMO_DIALOG };
#endif

protected:
    virtual void DoDataExchange(CDataExchange* pDX);

protected:
    CMenu m_Menu;
    CToolBar m_wndToolBar;
    CStatusBar m_wndStatusBar;
    CTabCtrl m_TabCtrl;
    
    std::vector<CChildDlg*> m_pChildDlgs;
    std::vector<HANDLE> m_hThreads;
    int m_nTabCount;

    void InitStatusBar();
    void InitToolBar();
    void AddNewTab();
    static DWORD WINAPI ThreadProc(LPVOID lpParam);
    void UpdateDataDisplay(int nTabIndex, CString strData);

    DECLARE_MESSAGE_MAP()
public:
    virtual BOOL OnInitDialog();
    afx_msg void OnTcnSelchangeTab(NMHDR *pNMHDR, LRESULT *pResult);
    afx_msg void OnFileNewtab();
    afx_msg LRESULT OnUpdateData(WPARAM wParam, LPARAM lParam);
};
2) 子对话框类(ChildDlg.h
// ChildDlg.h
#pragma once
#include "afxwin.h"

class CChildDlg : public CDialogEx
{
    DECLARE_DYNAMIC(CChildDlg)

public:
    CChildDlg(CWnd* pParent = nullptr);
    virtual ~CChildDlg();
    
    void UpdateData(const CString& strData);

    enum { IDD = IDD_CHILD_DLG };

protected:
    CEdit m_editData;

    virtual void DoDataExchange(CDataExchange* pDX);

    DECLARE_MESSAGE_MAP()
};

二,我实际制作的一个免费程序

1.界面如下图

2.这个小程序主要是监控LNC宝元系统的内存变化

在程序里面实现了5组内存值监控。每组最大10个寄存器值。这个程序从开始到最终定型,全程有DS的AI来参与,因为很久没有摸VC了,很多类,很多控件都很生疏了。有AI随时答疑,效率很快,3天时间就基本完成了。

3天时间,主要是搞清楚LNC宝元系统的API调用方式。包括一些特定的工具应该怎么选。API的初始化应该怎么做。API初始化,连接函数的参数等。

3.下面贴一些有AI参与的代码

1)监控线程的参数传递结构

	typedef struct __COL_REG__
	{
		unsigned int addr[MAX_REG_LINE];
		unsigned int data[MAX_REG_LINE];
	} CReg;

	struct TabData {
		int nTabIndex;
		CReg reg;
		CListCtrl ListCtrl;
		std::thread Thread;
		std::atomic<bool> bRunning;
	};

	typedef struct _List_Update_Data {
		int tabIndex;
		int row;
		CString value;
	} ListData;

	CTabCtrl m_TabCtrl;
	CListBox m_listLog;
	CComboBox m_comboDevices;

	TabData m_Tabs[5];
2)优化实现简易日志信息
	template <typename... Args>
	CString Safelogs(LPCTSTR lpszFormat, Args... args) {
		CString strmessage;
		strmessage.Format(lpszFormat, args...);
		CString strTime = CTime::GetCurrentTime().Format(_T(" -> [%H:%M:%S] "));
		m_listLog.AddString(strmessage + strTime);
		m_listLog.SetCurSel(m_listLog.GetCount() - 1);

		return strTime;
	}

//调用例子:

Safelogs(_T("SCIF DLL Initial Success,RET = %d "), m_nInitLibaryRet);
3)  实现动态添加Tab

void CRegMonitor32Dlg::AddTab()
{
	std::lock_guard<std::mutex> lock(m_Mutex);
	// 创建新 Tab
	int nIndex = m_TabCtrl.GetItemCount();  
	CString strTabName;
	strTabName.Format(_T(" Regs Monitor Group [%d] "), nIndex + 1);
	m_TabCtrl.InsertItem(nIndex, strTabName);

	// 动态创建 TabData
	//auto pTabData = std::make_unique<TabData>();
	//std::unique_ptr<TabData> pTabData =  m_Tabs[nIndex];

	TabData* pTabData = &m_Tabs[nIndex];
	pTabData->nTabIndex = nIndex;
	pTabData->bRunning = true;
	//添加行
	for (int i = 0; i < MAX_REG_LINE; i++)		//每次监控:12行内存
	{
		pTabData->reg.addr[i] = 0;
		pTabData->reg.data[i] = 0;
	}

	// 创建 ListCtrl
	CRect rect;
	m_TabCtrl.GetClientRect(&rect);
	m_TabCtrl.AdjustRect(FALSE, rect);

	pTabData->ListCtrl.Create(	WS_CHILD | WS_VISIBLE | LVS_REPORT ,
		rect, &m_TabCtrl, IDC_LISTCTRL + nIndex
	);

	pTabData->ListCtrl.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);
	pTabData->ListCtrl.InsertColumn(0, _T("序号"), LVCFMT_LEFT, 100);
	pTabData->ListCtrl.InsertColumn(1, _T("寄存器"), LVCFMT_LEFT, 150);
	pTabData->ListCtrl.InsertColumn(2, _T("内存值"), LVCFMT_LEFT, 150);

	// 启动线程(传递原始指针,需确保生命周期安全)
	pTabData->Thread = std::thread(ThreadProc, pTabData);

	SetCurrSelTab(nIndex);

	m_TabCtrl.SetCurSel(nIndex);
}

最开始实现时,用的是列表来保存Tab的数据,但是在线程调用时,

    pTabData->Thread = std::thread(ThreadProc, pTabData);

始终出错。不得以改成现在最大5组的定值数组方式。这应该是线程函数所特殊的地方。

4) AI也不是万能的,在很多地方,他给出来的例子,也不见得完全能够编译通过。

因此需要一些变通的方式。或者说,是因为我们的某些设置参数,不能完全兼容。

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐