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,

wps_clip_image-31401

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(dc.GetSafeHdc()), 0);

// 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(m_hIcon);

}

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”选出

wps_clip_image-21406