
AI辅助 DeepSeek程序编写 3.利用AI的知识库,自动生成小项目的框架,把我们的主要精力用在业务逻辑上
现在我们已经知道AI可以帮我做些什么了,因此在做一些小的项目的时侯,特别是如果我们并不是专业的程序员,或者我们是专业的程序员,但是因为我们不可能对所有的语言都了解,更遑论熟悉,因此在很多时候一些基础的框架,在建立过程中,就会花费巨大的精力。在此基础上,我们可以把这一部份劳动直接扔给AI,让他们来帮我们实现跟语言相关的部分,我们主要实现业务部分。
一,让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也不是万能的,在很多地方,他给出来的例子,也不见得完全能够编译通过。
因此需要一些变通的方式。或者说,是因为我们的某些设置参数,不能完全兼容。
更多推荐
所有评论(0)