VC++ 多线程实现双色球投注选号程序
来源:互联网 发布:objectsnmp 源码下载 编辑:程序博客网 时间:2024/04/30 03:46
双色球与 35 选 7 的规则,不用说。
双色球选号程序:
在 VS2005 中,新建对话框应用程序:CSportLottery
对话框程序:文本ID为:IDC_EDIT1, IDC_EDIT2, IDC_EDIT3, IDC_EDIT4, IDC_EDIT5, IDC_EDIT6,IDC_EDIT_1, IDC_EDIT2, IDC_EDIT_3, IDC_EDIT_4, IDC_EDIT_5, IDC_EDIT_6,
SportLotteryDlg.cpp的整个文件如下:
// SportLotteryDlg.cpp : implementation file
#include "stdafx.h"
#include "SportLottery.h"
#include "SportLotteryDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// CAboutDlg dialog used for App About
class CAboutDlg : public CDialog{
public:
CAboutDlg();
// Dialog Data
enum { IDD = IDD_ABOUTBOX };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
// Implementation
protected:
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD){
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX){
CDialog::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
END_MESSAGE_MAP()
// CSportLotteryDlg dialog
CSportLotteryDlg::CSportLotteryDlg(CWnd* pParent /*=NULL*/)
: CDialog(CSportLotteryDlg::IDD, pParent){
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CSportLotteryDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CSportLotteryDlg, CDialog)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDOK, &CSportLotteryDlg::OnBnClickedOk)
ON_BN_CLICKED(IDC_BUTTONSTOP, &CSportLotteryDlg::OnBnClickedButtonstop)
ON_BN_CLICKED(IDOK2, &CSportLotteryDlg::OnBnClickedOk2)
ON_BN_CLICKED(IDC_BUTTONSTOP2, &CSportLotteryDlg::OnBnClickedButtonstop2)
END_MESSAGE_MAP()
struct EditAndNO
{
CEdit *pEdit; //编辑框对象指针
int iNO; //编辑框值
};
HANDLE *g_hThread=NULL; //保存所有线程
HANDLE g_hEvent; //事件对象
int *g_iRand=NULL; //保存随机数
EditAndNO *g_pEAN=NULL; //保存所有EditAndNO结构对象
int *g_piNumNum=NULL; //编辑框个数
CEdit *p_Result_Edit;
/**
双色球的全局变量与35 选7 的共用,也可以分开
*/
DWORD CALLBACK GenerateRand(LPVOID pParam);
DWORD CALLBACK NumberChange(LPVOID pParam);
/*
判断号码是否存在,红色球的号码不同
*/
BOOL IsExistAlready(int *iNum,int n,int num ){
for(int i=0;i if(*(iNum+i)==num){ return 1; } } return 0; } /* 从小到大排序,如果有相同的数就返回0 */ BOOL sort_1(int arr[],int size) {//选择排序法 int i,j,pot; for(i=0;i for(j=i+1;j { if(arr[i]>arr[j]){ pot=arr[i];arr[i]=arr[j];arr[j]=pot; } else if(arr[i]==arr[j]){ return 0; } } } return 1; } ///////////////////////////////////////////////////// //生成随机数的线程 /* “双色球”每注投注号码由个红色球号码和个蓝色球号码组成。红色球号码从--33中选择;蓝色球号码从--16中选择。 */ DWORD CALLBACK GenerateRandDouble(LPVOID pParam){ int l_iNum=*(int *)pParam,i; while(WaitForSingleObject(g_hEvent,21)==WAIT_TIMEOUT) { //生成随机数 srand(rand()); int randt; //srand( (unsigned)time( NULL ) ); for(i=0;i randt=(rand()%33)+1; while(IsExistAlready(g_iRand,i,randt)){ randt=(rand()%33)+1; } *(g_iRand+i)=randt; } randt=(rand()%16)+1; while(IsExistAlready(g_iRand,l_iNum-1,randt)){ randt=(rand()%16)+1; } *(g_iRand+l_iNum-1)=randt; } return 1; } ///////////////////////////////////////////////////// //生成随机数的线程 35 选7 DWORD CALLBACK GenerateRand(LPVOID pParam) { int l_iNum=*(int *)pParam,i; while(WaitForSingleObject(g_hEvent,21)==WAIT_TIMEOUT) { //生成随机数 srand(rand()); //srand( (unsigned)time( NULL ) ); for(i=0;i int randt=(rand()%35)+1; while(IsExistAlready(g_iRand,i,randt)){ randt=(rand()%35)+1; } *(g_iRand+i)=randt; } } return 1; } //更新编辑框数字的线程 DWORD CALLBACK NumberChange(LPVOID pParam) { EditAndNO *l_pEAN=(EditAndNO *)pParam; CEdit *l_pEdit=l_pEAN->pEdit; int l_iNO=l_pEAN->iNO; TCHAR l_cNum[2]; // char l_cNum[3]; memset(l_cNum,0,sizeof(l_cNum)); l_cNum[0]='0'; while(WaitForSingleObject(g_hEvent,1)==WAIT_TIMEOUT) { //itoa(g_iRand[l_iNO]%35+1,l_cNum,10); ::wsprintf(l_cNum,_T("%0.2d"),g_iRand[l_iNO]); //改变文本框数字 l_pEdit->SetWindowText((LPCTSTR)(l_cNum)); l_pEdit->UpdateData(false); } return 1; } // CSportLotteryDlg message handlers BOOL CSportLotteryDlg::OnInitDialog() { CDialog::OnInitDialog(); // Add "About..." menu item to system menu. // IDM_ABOUTBOX must be in the system command range. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) { CString strAboutMenu; strAboutMenu.LoadString(IDS_ABOUTBOX); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } // Set the icon for this dialog. The framework does this automatically // when the application's main window is not a dialog SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(m_hIcon, FALSE); // Set small icon // TODO: Add extra initialization here return TRUE; // return TRUE unless you set the focus to a control } void CSportLotteryDlg::OnSysCommand(UINT nID, LPARAM lParam) { if ((nID & 0xFFF0) == IDM_ABOUTBOX) { CAboutDlg dlgAbout; dlgAbout.DoModal(); } else { CDialog::OnSysCommand(nID, lParam); } } // If you add a minimize button to your dialog, you will need the code below // to draw the icon. For MFC applications using the document/view model, // this is automatically done for you by the framework. void CSportLotteryDlg::OnPaint(){ if (IsIconic()) { CPaintDC dc(this); // device context for painting SendMessage(WM_ICONERASEBKGND, reinterpret_cast // Center icon in client rectangle int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // Draw the icon dc.DrawIcon(x, y, m_hIcon); } else { CDialog::OnPaint(); } } // The system calls this function to obtain the cursor to display while the user drags // the minimized window. HCURSOR CSportLotteryDlg::OnQueryDragIcon() { return static_cast } void CSportLotteryDlg::OnBnClickedOk()//35 选7 的按钮 { CEdit *l_pEdit[7]; unsigned long id; //创建事件对象 g_hThread=new HANDLE[8]; g_hEvent=CreateEvent(NULL,true,false,NULL); g_pEAN=new EditAndNO[7]; g_iRand=new int[7]; //开始生成随机数的线程 g_piNumNum=new int; *g_piNumNum=7; g_hThread[7]=CreateThread(NULL,0,GenerateRand,(LPVOID)g_piNumNum,0,&id); //分别开始更新每个编辑框的线程 l_pEdit[0]=(CEdit *)GetDlgItem(IDC_EDIT1); g_pEAN[0].pEdit=l_pEdit[0]; g_pEAN[0].iNO=0; g_hThread[0]=CreateThread(NULL,0,NumberChange,(LPVOID)g_pEAN,0,&id); l_pEdit[1]=(CEdit *)GetDlgItem(IDC_EDIT2); g_pEAN[1].pEdit=l_pEdit[1]; g_pEAN[1].iNO=1; g_hThread[1]=CreateThread(NULL,0,NumberChange,(LPVOID)(g_pEAN+1),0,&id); l_pEdit[2]=(CEdit *)GetDlgItem(IDC_EDIT3); g_pEAN[2].pEdit=l_pEdit[2]; g_pEAN[2].iNO=2; g_hThread[2]=CreateThread(NULL,0,NumberChange,(LPVOID)(g_pEAN+2),0,&id); l_pEdit[3]=(CEdit *)GetDlgItem(IDC_EDIT4); g_pEAN[3].pEdit=l_pEdit[3]; g_pEAN[3].iNO=3; g_hThread[3]=CreateThread(NULL,0,NumberChange,(LPVOID)(g_pEAN+3),0,&id); l_pEdit[4]=(CEdit *)GetDlgItem(IDC_EDIT5); g_pEAN[4].pEdit=l_pEdit[4]; g_pEAN[4].iNO=4; g_hThread[4]=CreateThread(NULL,0,NumberChange,(LPVOID)(g_pEAN+4),0,&id); l_pEdit[5]=(CEdit *)GetDlgItem(IDC_EDIT6); g_pEAN[5].pEdit=l_pEdit[5]; g_pEAN[5].iNO=5; g_hThread[5]=CreateThread(NULL,0,NumberChange,(LPVOID)(g_pEAN+5),0,&id); l_pEdit[6]=(CEdit *)GetDlgItem(IDC_EDIT7); g_pEAN[6].pEdit=l_pEdit[6]; g_pEAN[6].iNO=6; g_hThread[6]=CreateThread(NULL,0,NumberChange,(LPVOID)(g_pEAN+6),0,&id); p_Result_Edit=(CEdit *)GetDlgItem(IDC_EDIT_Result1); //更新按钮状态 GetDlgItem(IDC_BUTTONSTOP)->EnableWindow(true); GetDlgItem(IDOK)->EnableWindow(false); GetDlgItem(IDC_BUTTONSTOP2)->EnableWindow(true); GetDlgItem(IDOK2)->EnableWindow(false); GetDlgItem(IDCANCEL)->EnableWindow(false); } void CSportLotteryDlg::OnBnClickedButtonstop(){ //关闭所有线程 SetEvent(g_hEvent); CloseHandle(g_hThread[0]); CloseHandle(g_hThread[1]); CloseHandle(g_hThread[2]); CloseHandle(g_hThread[3]); CloseHandle(g_hThread[4]); CloseHandle(g_hThread[5]); CloseHandle(g_hEvent); //更新按钮状态 GetDlgItem(IDC_BUTTONSTOP)->EnableWindow(false); GetDlgItem(IDOK)->EnableWindow(true); GetDlgItem(IDC_BUTTONSTOP2)->EnableWindow(false); GetDlgItem(IDOK2)->EnableWindow(true); GetDlgItem(IDCANCEL)->EnableWindow(true); UpdateData(1); int aa[7];//=new int[7]; //for(int i=0;i<7;i++){} CString ss; g_pEAN[0].pEdit->GetWindowText(ss); swscanf(ss.GetBuffer(0), _T("%d"), &aa[0]); ss.ReleaseBuffer(); g_pEAN[1].pEdit->GetWindowText(ss); swscanf(ss.GetBuffer(0), _T("%d"), &aa[1]); ss.ReleaseBuffer(); g_pEAN[2].pEdit->GetWindowText(ss); swscanf(ss.GetBuffer(0), _T("%d"), &aa[2]); ss.ReleaseBuffer(); g_pEAN[3].pEdit->GetWindowText(ss); swscanf(ss.GetBuffer(0), _T("%d"), &aa[3]); ss.ReleaseBuffer(); g_pEAN[4].pEdit->GetWindowText(ss); swscanf(ss.GetBuffer(0), _T("%d"), &aa[4]); ss.ReleaseBuffer(); g_pEAN[5].pEdit->GetWindowText(ss); swscanf(ss.GetBuffer(0), _T("%d"), &aa[5]); ss.ReleaseBuffer(); g_pEAN[6].pEdit->GetWindowText(ss); swscanf(ss.GetBuffer(0), _T("%d"), &aa[6]); ss.ReleaseBuffer(); /**从小到大排序 **/ if(!sort_1(aa,6)){ MessageBox(_T(" 有相同数")); } CString s_Result; s_Result.Format(_T("%0.2d %0.2d %0.2d %0.2d %0.2d %0.2d + %0.2d"),aa[0],aa[1],aa[2],aa[3],aa[4],aa[5],aa[6]); p_Result_Edit->SetWindowText(s_Result); p_Result_Edit->UpdateData(false); delete [] g_hThread; delete [] g_iRand; delete [] g_pEAN; delete [] g_piNumNum; //delete []aa; } void CSportLotteryDlg::OnBnClickedOk2() { CEdit *l_pEdit[7]; unsigned long id; //创建事件对象 g_hThread=new HANDLE[8]; g_hEvent=CreateEvent(NULL,true,false,NULL); g_pEAN=new EditAndNO[7]; g_iRand=new int[7]; //开始生成随机数的线程 g_piNumNum=new int; *g_piNumNum=7; g_hThread[7]=CreateThread(NULL,0,GenerateRandDouble,(LPVOID)g_piNumNum,0,&id); //分别开始更新每个编辑框的线程 l_pEdit[0]=(CEdit *)GetDlgItem(IDC_EDIT_1); g_pEAN[0].pEdit=l_pEdit[0]; g_pEAN[0].iNO=0; g_hThread[0]=CreateThread(NULL,0,NumberChange,(LPVOID)g_pEAN,0,&id); l_pEdit[1]=(CEdit *)GetDlgItem(IDC_EDIT_2); g_pEAN[1].pEdit=l_pEdit[1]; g_pEAN[1].iNO=1; g_hThread[1]=CreateThread(NULL,0,NumberChange,(LPVOID)(g_pEAN+1),0,&id); l_pEdit[2]=(CEdit *)GetDlgItem(IDC_EDIT_3); g_pEAN[2].pEdit=l_pEdit[2]; g_pEAN[2].iNO=2; g_hThread[2]=CreateThread(NULL,0,NumberChange,(LPVOID)(g_pEAN+2),0,&id); l_pEdit[3]=(CEdit *)GetDlgItem(IDC_EDIT_4); g_pEAN[3].pEdit=l_pEdit[3]; g_pEAN[3].iNO=3; g_hThread[3]=CreateThread(NULL,0,NumberChange,(LPVOID)(g_pEAN+3),0,&id); l_pEdit[4]=(CEdit *)GetDlgItem(IDC_EDIT_5); g_pEAN[4].pEdit=l_pEdit[4]; g_pEAN[4].iNO=4; g_hThread[4]=CreateThread(NULL,0,NumberChange,(LPVOID)(g_pEAN+4),0,&id); l_pEdit[5]=(CEdit *)GetDlgItem(IDC_EDIT_6); g_pEAN[5].pEdit=l_pEdit[5]; g_pEAN[5].iNO=5; g_hThread[5]=CreateThread(NULL,0,NumberChange,(LPVOID)(g_pEAN+5),0,&id); l_pEdit[6]=(CEdit *)GetDlgItem(IDC_EDIT_7); g_pEAN[6].pEdit=l_pEdit[6]; g_pEAN[6].iNO=6; g_hThread[6]=CreateThread(NULL,0,NumberChange,(LPVOID)(g_pEAN+6),0,&id); p_Result_Edit=(CEdit *)GetDlgItem(IDC_EDIT_Result2); //更新按钮状态 GetDlgItem(IDC_BUTTONSTOP)->EnableWindow(true); GetDlgItem(IDOK)->EnableWindow(false); GetDlgItem(IDC_BUTTONSTOP2)->EnableWindow(true); GetDlgItem(IDOK2)->EnableWindow(false); GetDlgItem(IDCANCEL)->EnableWindow(false); } void CSportLotteryDlg::OnBnClickedButtonstop2() { OnBnClickedButtonstop(); } 运行结果: 点击按钮“Start”,开始选号,“Stop”选出