timer定时器在项目初始化的时候注入service为null 3C

定时器任务开始执行的时候,一直没办法加载,后来发现是service为null
这是定时器执行的方法,在调用TimeWorkAction以后,里面的service就是null了

 public class WorkTimer extends HttpServlet{


    //时间间隔(一天)  
    private static final long PERIOD_DAY = 24 * 60 * 60 * 1000;

    @Override
    public void init() throws ServletException {
        // TODO Auto-generated method stub
        System.out.println("开始执行定时器查询");
        Calendar calendar = Calendar.getInstance();  
        calendar.set(Calendar.HOUR_OF_DAY, 19); //夜晚23点 
        calendar.set(Calendar.MINUTE, 57);
        calendar.set(Calendar.SECOND, 0);
        Date date=calendar.getTime(); //第一次执行定时任务的时间  
        TimerTask task = new TimeWorkAction();
        Timer timer = new Timer();
        timer.schedule(task,date, PERIOD_DAY);
        super.init();
    }


}
 @Component
public class TimeWorkAction extends TimerTask{

    WorkService workService = (WorkService)ApplicationContextUtil.getBean("workService");
    Work work = (Work)ApplicationContextUtil.getBean("work");
    public void run(){
        try {
            //获取当前日期
            SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
            Date date1 = new Date();
            String dates = simpleDateFormat.format(date1);
            long currentDate = 0;
            try {
                currentDate = simpleDateFormat.parse(dates).getTime();
            } catch (ParseException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            //获取权限用户
            List userName = workService.getName();
            for (int i = 0; i < userName.size(); i++) {
                Object obj = userName.get(i);
                String name = obj.toString();
                List addDate = workService.addDate(name,currentDate);
                if(addDate.isEmpty()){
                    work = new Work();
                    work.setName(name);
                    work.setWorkDate(currentDate);
                    workService.save(work);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public WorkService getWorkService() {
        return workService;
    }

    public void setWorkService(WorkService workService) {
        this.workService = workService;
    }

    public Work getWork() {
        return work;
    }

    public void setWork(Work work) {
        this.work = work;
    }


}

之前service直接private WorkService workService也不行

1个回答

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
子线程阻塞来调用定时器确保定时函数完成
小弟是在初始化一个窗口的时候创建了一个子线程,在这个子线程里面调用对了一个定时器来定时检测一些信息,然后将检测的结果返回给该线程处理,然后将处理结果在主线程里面和用户交互,现在是发现定时器的那个定时执行的函数不工作,在设置定时器下面用一个MessageBox阻塞一下,定时执行的函数就工作,但是其他组的线程的办法貌似不行,求指点,部分代码如下 unsigned int _stdcall Thread1(LPVOID) { HANDLE g_hEvent; g_hEvent = CreateEvent(NULL,TRUE,FALSE,NULL); ResetEvent(g_hEvent); SetTimer(NULL,0,5000,Timer1); //MessageBox(NULL,TEXT("test"),TEXT("11"),MB_OK);//阻塞线程才能让timer运行,用waitformultipleobjects或者waitforsingleobject //SuspendThread(hThread1); //Sleep(5000); WaitForSingleObject(g_hEvent,INFINITE);//线程无法阻塞,没有运行完settimer就返回了 return 0; } BOOL Main_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam) { UINT uId; //HANDLE g_hEvent = CreateEvent(NULL,FALSE,FALSE,NULL); hThread1 = (HANDLE)_beginthreadex(NULL,0,Thread1,NULL,0,&uId); return TRUE; }
求大神指教这个程序错在哪
[cpp] view plaincopyprint? //#include "stdafx.h" #include <windows.h> #include <math.h> #include <stdlib.h> //#pragma comment(/Entry:WinMain) #define ID_TIMER 1 #define SNOWNUM 500 // 雪花数量 #define CONTRAST 50 // 对比度 #define YSTART 5 // 用于确定雪花初始时的y坐标 #define SNOWCR RGB(0xFF, 0xFF, 0xFF) //雪花的颜色—白色 #define SNOWGATHERCR RGB(0xDB, 0xDB, 0xFF) //堆积雪花的颜色 typedef struct tagSnow { POINT ptSnowsPos[SNOWNUM]; //用于保存各个雪花的坐标 COLORREF crOrg[SNOWNUM]; //用于画雪花前屏幕原来的颜色 int iVx, iVy, iAllVx, iAllVy; }Snow; void initSnow(HDC hdc, Snow *sn, int iSnow, int cxScreen); int GetContrast(HDC hdc, Snow *sn, int iSnow); void drawSnow(HDC hdc, Snow *sn, int cxScreen); LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ; int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { static TCHAR szAppName[] = TEXT ("clsDeskSnow") ; HWND hwnd ; MSG msg ; WNDCLASS wndclass ; wndclass.style = CS_HREDRAW | CS_VREDRAW ; wndclass.lpfnWndProc = WndProc ; wndclass.cbClsExtra = 0 ; wndclass.cbWndExtra = 0 ; wndclass.hInstance = hInstance ; wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ; wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ; wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ; wndclass.lpszMenuName = NULL ; wndclass.lpszClassName = szAppName ; if(!RegisterClass (&wndclass)) { MessageBox (NULL, TEXT ("This program requires Windows NT!"), szAppName, MB_ICONERROR) ; return 0; } hwnd = CreateWindow (szAppName, TEXT ("桌面下雪"), WS_MINIMIZEBOX | WS_SYSMENU, CW_USEDEFAULT, CW_USEDEFAULT, 240, 120, NULL, NULL, hInstance, NULL) ; ShowWindow (hwnd, iCmdShow) ; UpdateWindow (hwnd) ; while (GetMessage (&msg, NULL, 0, 0)) { TranslateMessage (&msg) ; DispatchMessage (&msg) ; } return msg.wParam ; } LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { HDC hdc ; PAINTSTRUCT ps ; RECT rect ; static int cxScreen, cyScreen; //屏幕宽高度(单位:像素) static int iTimes, iLoopTimes=100; static Snow snowDream; int i; switch (message) { case WM_CREATE: cxScreen = GetSystemMetrics (SM_CXSCREEN) ; cyScreen = GetSystemMetrics (SM_CYSCREEN) ; srand ((int) GetCurrentTime ()) ; //初始化随机数发生器 snowDream.iAllVx = (unsigned)rand()%3 - 1; //雪花总体水平飘行速度(-1,0,1) snowDream.iAllVy = (unsigned)rand()%2 + 1; //雪花总体垂直下落速度(1,2) hdc = GetDC(NULL); //检索整个屏幕的设备上下文环境 for(i=0; i <SNOWNUM; i++) { snowDream.ptSnowsPos[i].x = rand() % cxScreen; //一个雪花开始下落的x坐标 snowDream.ptSnowsPos[i].y = rand() % YSTART; //一个雪花开始下落的y坐标 snowDream.crOrg[i] = GetPixel(hdc, snowDream.ptSnowsPos[i].x, snowDream.ptSnowsPos[i].y); //获取给定点的原来的颜色值 } ReleaseDC(NULL, hdc); SetTimer(hwnd, ID_TIMER, 10, NULL); //定时器,10毫秒 return 0 ; case WM_DISPLAYCHANGE: //当显示分辨率改变的时候 cxScreen = GetSystemMetrics (SM_CXSCREEN) ; cyScreen = GetSystemMetrics (SM_CYSCREEN) ; return 0; case WM_TIMER: hdc = GetDC(NULL); //检索整个屏幕的设备上下文环境 if(iTimes > iLoopTimes) { iTimes = 0; iLoopTimes = 50 + (unsigned)rand()%50; if(snowDream.iAllVx != 0) snowDream.iAllVx = 0; else snowDream.iAllVx = (unsigned)rand()%3 - 1; //雪花总体水平飘行速度(-1,0,1) snowDream.iAllVy = (unsigned)rand()%2 + 1; //雪花总体垂直下落速度(1,2) } else iTimes++; drawSnow(hdc, &snowDream, cxScreen); ReleaseDC(NULL, hdc); return 0; case WM_PAINT: hdc = BeginPaint (hwnd, &ps) ; GetClientRect (hwnd, &rect) ; DrawText (hdc, TEXT ("桌面下雪!"), -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER) ; EndPaint (hwnd, &ps) ; return 0 ; case WM_DESTROY: KillTimer(hwnd, ID_TIMER); // 中止定时器 InvalidateRect(NULL, NULL, TRUE); // 刷新桌面 PostQuitMessage (0) ; return 0 ; } return DefWindowProc (hwnd, message, wParam, lParam) ; } void initSnow(HDC hdc, Snow *sn, int iSnow, int cxScreen) //初始化第iSnow个雪花 { sn->ptSnowsPos[iSnow].x = (unsigned)rand() % cxScreen; //x范围整个屏幕宽 sn->ptSnowsPos[iSnow].y = (unsigned)rand() % YSTART; //y范围离屏幕顶部YSTART像素点以内 sn->crOrg[iSnow] = GetPixel(hdc, sn->ptSnowsPos[iSnow].x, sn->ptSnowsPos[iSnow].y ) ;//获取给定点的原来的颜色值 } int GetContrast(HDC hdc, Snow *sn, int iSnow) { int iR, iG, iB; COLORREF crCmp; if(0 == sn->iVx) //若水平速度为0,则取比其大一个像素的正下方的点 crCmp = GetPixel(hdc, sn->ptSnowsPos[iSnow].x, sn->ptSnowsPos[iSnow].y + 1); else //若水平速度>0,取右下方的点。 <0则取左下方的点 crCmp = GetPixel(hdc, sn->ptSnowsPos[iSnow].x + (sn->iVx>0?1:-1), sn->ptSnowsPos[iSnow].y + 1); if(crCmp==SNOWCR) //如果为雪花的颜色 return 0; //分别获取crCmp与对比点的蓝、绿、红部分的差值 iB = abs((crCmp>>16)&0xFF - (sn->crOrg[iSnow]>>16)&0xFF); iG = abs((crCmp>>8)&0xFF - (sn->crOrg[iSnow]>>8)&0xFF); iR = abs((crCmp)&0xFF - (sn->crOrg[iSnow])&0xFF); return (iR+iG+iB)/3; } void drawSnow(HDC hdc, Snow *sn, int cxScreen) { int i; for(i=0; i <SNOWNUM; i++) { //如果保存的原来的颜色不是雪花的颜色 if(sn->crOrg[i] != SNOWCR) SetPixel(hdc, sn->ptSnowsPos[i].x, sn->ptSnowsPos[i].y, sn->crOrg[i]); //还原上一个位置的颜色 sn->iVx = sn->iAllVx*(i%3+1); //雪花的x飘动速度 sn->iVy = sn->iAllVy*(i%3+1); //雪花的y飘动速度 //rand()%5-2使雪花下落的时候 有抖动效果 sn->ptSnowsPos[i].x += sn->iVx+rand()%5-2; //雪花的下一个x坐标 sn->ptSnowsPos[i].y += sn->iVy+1; //雪花的下一个y坐标 //获取给定点的原来的颜色值 sn->crOrg[i] = GetPixel(hdc, sn->ptSnowsPos[i].x, sn->ptSnowsPos[i].y); if(CLR_INVALID == sn->crOrg[i]) //如果获取颜色失败,即雪花飘出了屏幕 { initSnow(hdc, sn, i, cxScreen); //重新初始化 雪花 continue; } if(sn->crOrg[i] != SNOWCR) //若当前点的颜色 不等于 雪花的颜色 { if(SNOWGATHERCR == sn->crOrg[i]) //当前点的颜色=堆积的雪的颜色 { //设置为雪花的颜色 SetPixel(hdc, sn->ptSnowsPos[i].x, sn->ptSnowsPos[i].y, SNOWCR); sn->crOrg[i] = SNOWCR; //initSnow(hdc, sn, i, cxScreen); //重新初始化 雪花 } else if(GetContrast(hdc, sn, i) > 50) //若对比度>50 { //堆积雪花 SetPixel(hdc, sn->ptSnowsPos[i].x, sn->ptSnowsPos[i].y, SNOWGATHERCR); SetPixel(hdc, sn->ptSnowsPos[i].x-1, sn->ptSnowsPos[i].y+1, SNOWGATHERCR); SetPixel(hdc, sn->ptSnowsPos[i].x+1, sn->ptSnowsPos[i].y+1, SNOWGATHERCR); initSnow(hdc, sn, i, cxScreen); //重新初始化 雪花 } else //对比度 <50,不堆积,画出这帧雪花.等下次的时候再还原此点原本的颜色.以产生飘动效果 SetPixel(hdc, sn->ptSnowsPos[i].x, sn->ptSnowsPos[i].y, SNOWCR); } } }
贪吃蛇程序,开始可正常操作,按下控制按钮后按键操作不能用
我写了个贪吃蛇程序,用c++ + windows编程写的,左边是游戏区,右边有暂停,加减速等按钮,刚开始可正常操作贪吃蛇,但是在按下按钮后再用上下左右操作就没反应了,不知道为什么?求大神解答 #include <windows.h> #include <vector> #include <ctime> #include <iostream> using namespace std; //定义 游戏区 和 控制区 大小 #define BOUND_SIZE 10 //边框大小 #define SNAKE_SIZE 10 //贪吃蛇方块大小 #define GAME_WIDTH 80 //游戏区宽 #define GAME_HEIGHT 60 //长 #define INFO_WIDTH 30 //游戏信息区宽 #define INFO_HEIGHT GAME_HEIGHT //长 #define MAX_NODE 20 //蛇的最大长度 #define MY_TIMER 1 //定时器ID #define DE_INTERVAL 100 //定义贪吃蛇的默认移动速度--500毫秒/节 // 间隔 #define PAUSE_ID 1//暂停按钮 #define SPDUP_ID 2//加减速 #define SPDDOWN_ID 3 #define GAME_AGAIN_ID 4//游戏重新开始 #define BT_SIZE_WIDTH 10//按钮大小 #define BT_SIZE_HEIGHT 5 // 蛇 vector<POINT> vSnake; int headPos, tailPos; // 头尾的位置 int len; // 长度 int interval; // 速度 POINT direct; // 方向 - 横移 bool needsFood = true; // 是否需要食物 POINT ptFood; // 食物坐标 bool bPause = false; // 暂停状态 enum Status {CONTINUE, WIN, LOST}; Status g_status; //游戏状态 LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPreInstance, PSTR szCmdLine, int iCmdShow) { static TCHAR szAppName[] = TEXT("HelloWin"); HWND hwnd; MSG msg; WNDCLASS wndclass; wndclass.style = CS_HREDRAW | CS_VREDRAW; wndclass.lpfnWndProc = WndProc; wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; wndclass.hInstance = hInstance; wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION); wndclass.hCursor = LoadCursor(NULL, IDC_ARROW); wndclass.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH); wndclass.lpszMenuName = NULL; wndclass.lpszClassName = szAppName; if (!RegisterClass(&wndclass)) { MessageBox(NULL, TEXT("This program requires Windows NT!"), szAppName, MB_ICONERROR); return 0; } hwnd = CreateWindow(szAppName, TEXT("The Hello Program"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL); ShowWindow (hwnd, iCmdShow); UpdateWindow(hwnd); while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage (&msg); DispatchMessage (&msg); } return msg.wParam; } // 初始化蛇 void initSnake() { // 初始两个结点位置 vSnake.clear(); vSnake.resize(MAX_NODE); // 初始长度 len = 2; for (int i = 0; i < len; i++) { vSnake[i].x=i; vSnake[i].y=1; } // 初始尾巴在蛇身的位置 tailPos = 0; headPos = 1; interval = DE_INTERVAL; // 初始速度 direct = {1, 0}; // 初始方向 g_status = CONTINUE; // 初始化游戏状态 needsFood = true; // 需要食物 bPause = false; // 不暂停 } // 获取蛇的结点位置 POINT &getSnakeNode(int index) { int i = tailPos + index; // 尽量在更局部的地方修改变量以增加可维护性-tailPos if(i >= MAX_NODE) { i -= MAX_NODE; } return vSnake[i]; } // 画蛇 void drawSnake(HDC hdc) { int i; POINT ptNode; HBRUSH hBrush = (HBRUSH) GetStockObject (WHITE_BRUSH); //贪吃蛇块上色 SelectObject(hdc, hBrush); /* 也可以for(i = tail; i < head; i++) 但是需要判断head大于界值后从0续起的情况 */ for(i = 0; i < len; i++) { //从蛇尾开始画 ptNode = getSnakeNode(i); Rectangle(hdc, ptNode.x * SNAKE_SIZE + BOUND_SIZE, ptNode.y * SNAKE_SIZE + BOUND_SIZE, (ptNode.x + 1) * SNAKE_SIZE + BOUND_SIZE, (ptNode.y + 1) * SNAKE_SIZE + BOUND_SIZE); } } // 画食物 void drawFood(HDC hdc) { POINT ptNode; int x, y; int i = 0; HBRUSH hBrush=(HBRUSH)GetStockObject(BLACK_BRUSH); if (needsFood) { srand(time(0)); //随机数种子 //获取随机坐标,不为蛇身 while(i != len) { x=rand() % (GAME_WIDTH - 1); y=rand() % (GAME_HEIGHT - 1); for(i = 0; i < len; i++) // 食物是否在蛇身,若在则直接退出 { ptNode = getSnakeNode(i); if(ptNode.x == x && ptNode.y == y) break; } } ptFood.x = x; ptFood.y = y; needsFood = false; } SelectObject(hdc,hBrush); // 选取画刷 Ellipse(hdc, BOUND_SIZE + ptFood.x * SNAKE_SIZE, // 画食物 BOUND_SIZE + ptFood.y * SNAKE_SIZE, BOUND_SIZE + (ptFood.x + 1) * SNAKE_SIZE, BOUND_SIZE + (ptFood.y + 1) * SNAKE_SIZE); } // 刷新蛇的状态(移动) void refreshSnake() { POINT newNode; newNode.x = vSnake[headPos].x + direct.x; newNode.y = vSnake[headPos].y + direct.y; // 吃到食物 - 尾不变,头 + 1 if (!needsFood && newNode.x == ptFood.x && newNode.y == ptFood.y) { len++; needsFood = true; if (len == MAX_NODE) { g_status = WIN; } headPos = headPos + 1 >= MAX_NODE ? 0 : headPos + 1; vSnake[headPos] = newNode; return; } // 蛇撞墙 if (newNode.x < 0 || newNode.x >= GAME_WIDTH || newNode.y < 0 || newNode.y >= GAME_HEIGHT) { g_status = LOST; return; } POINT ptNode; // 蛇碰到自己的身体 for (int i = 0; i < len; i++) { ptNode = getSnakeNode(i); if (ptNode.x == newNode.x && ptNode.y == newNode.y) { g_status = LOST; return; } } headPos = headPos + 1 >= MAX_NODE ? 0 : headPos + 1; tailPos = tailPos + 1 >= MAX_NODE ? 0 : tailPos + 1; vSnake[headPos] = newNode; } LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { int wmId, wmEvent; HDC hdc; PAINTSTRUCT ps; RECT rect; HBRUSH hBrush; int nWinW, nWinH, nClientW, nClientH; // 窗口和客户区的长宽 static HWND hPause; //暂停 static HWND hSpdUp; //加速 static HWND hSpdDown; //减速 static HWND hStartAgain; //重新开始 switch (message) { case WM_CREATE: GetWindowRect(hwnd,&rect); // 绘制窗口大小,获取外窗口大小 nWinW = rect.right-rect.left; nWinH = rect.bottom-rect.top; GetClientRect(hwnd,&rect); // 客户区大小,内窗口大小 nClientW = rect.right-rect.left; nClientH = rect.bottom-rect.top; //修改窗口大小,客户区大小+边框大小(nWinX-nClientX外边框) MoveWindow(hwnd, 0, 0, (GAME_WIDTH + INFO_WIDTH) * SNAKE_SIZE + BOUND_SIZE * 3 + (nWinW - nClientW), (GAME_HEIGHT * SNAKE_SIZE + BOUND_SIZE * 2 + (nWinH-nClientH)), TRUE); hStartAgain = CreateWindow(TEXT("BUTTON"), TEXT("重新开始"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 2 * BOUND_SIZE + GAME_WIDTH * SNAKE_SIZE + (INFO_WIDTH - BT_SIZE_WIDTH) * SNAKE_SIZE / 2, (INFO_HEIGHT - BT_SIZE_HEIGHT * 5) * SNAKE_SIZE / 2 - BOUND_SIZE, BT_SIZE_WIDTH * SNAKE_SIZE, BT_SIZE_HEIGHT * SNAKE_SIZE, hwnd, (HMENU) GAME_AGAIN_ID, ((LPCREATESTRUCT) lParam) -> hInstance, NULL); // 重新开始按钮,位置(横,纵,长宽) hPause = CreateWindow(TEXT("BUTTON"), TEXT("暂停"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 2 * BOUND_SIZE + GAME_WIDTH * SNAKE_SIZE + (INFO_WIDTH - BT_SIZE_WIDTH) * SNAKE_SIZE / 2, (INFO_HEIGHT - BT_SIZE_HEIGHT * 3) * SNAKE_SIZE / 2, BT_SIZE_WIDTH * SNAKE_SIZE, BT_SIZE_HEIGHT * SNAKE_SIZE, hwnd, (HMENU) PAUSE_ID, ((LPCREATESTRUCT) lParam) -> hInstance, NULL); // 暂停按钮,位置(横,纵,长宽) hSpdUp = CreateWindow(TEXT("BUTTON"), TEXT("速度加快"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 2 * BOUND_SIZE + GAME_WIDTH * SNAKE_SIZE + (INFO_WIDTH - BT_SIZE_WIDTH) * SNAKE_SIZE / 2, BOUND_SIZE + (INFO_HEIGHT - BT_SIZE_HEIGHT * 3) * SNAKE_SIZE / 2 + BT_SIZE_HEIGHT * SNAKE_SIZE, BT_SIZE_WIDTH * SNAKE_SIZE, BT_SIZE_HEIGHT * SNAKE_SIZE, hwnd, (HMENU) SPDUP_ID, ((LPCREATESTRUCT) lParam) -> hInstance, NULL); //加速按钮,位置(横,纵,长宽) hSpdDown = CreateWindow(TEXT("BUTTON"), TEXT("速度减慢"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 2 * BOUND_SIZE + GAME_WIDTH * SNAKE_SIZE + (INFO_WIDTH - BT_SIZE_WIDTH) * SNAKE_SIZE / 2, BOUND_SIZE + (INFO_HEIGHT - BT_SIZE_HEIGHT * 3) * SNAKE_SIZE / 2 + BOUND_SIZE + BT_SIZE_HEIGHT * SNAKE_SIZE * 2, BT_SIZE_WIDTH * SNAKE_SIZE, BT_SIZE_HEIGHT * SNAKE_SIZE, hwnd, (HMENU) SPDDOWN_ID, ((LPCREATESTRUCT) lParam) -> hInstance, NULL); //减速按钮,位置(横,纵,长宽) initSnake(); SetTimer(hwnd, MY_TIMER, interval, NULL); //设置定时器 return 0; case WM_PAINT: hdc = BeginPaint(hwnd, &ps); hBrush = (HBRUSH) GetStockObject(GRAY_BRUSH); // 给游戏区和控制区上色 SelectObject(hdc, hBrush); Rectangle(hdc, BOUND_SIZE, BOUND_SIZE, // 游戏区 BOUND_SIZE + GAME_WIDTH * SNAKE_SIZE, BOUND_SIZE + GAME_HEIGHT * SNAKE_SIZE); Rectangle(hdc, // 控制区 BOUND_SIZE * 2 + GAME_WIDTH * SNAKE_SIZE, BOUND_SIZE, BOUND_SIZE + (GAME_WIDTH + INFO_WIDTH) * SNAKE_SIZE, BOUND_SIZE + INFO_HEIGHT * SNAKE_SIZE); drawSnake(hdc); drawFood(hdc); EndPaint (hwnd, &ps); return 0; case WM_TIMER: //移动蛇 refreshSnake(); if (g_status != CONTINUE) { KillTimer(hwnd, MY_TIMER); (g_status == WIN) ? MessageBox(NULL, TEXT("你赢了"), TEXT("Win"), MB_OK) : MessageBox(NULL,TEXT("你输了"), TEXT("Fail"), MB_OK); initSnake(); } InvalidateRect(hwnd,NULL,TRUE); return 0; case WM_KEYDOWN: switch(wParam) { case VK_UP: //调节方向(向原来方向或相反方向时不反应) if(direct.x!=0) { direct.x=0; direct.y=-1; } break; case VK_DOWN: if(direct.x!=0) { direct.x=0; direct.y=1; } break; case VK_LEFT: if(direct.y!=0) { direct.x=-1; direct.y=0; } break; case VK_RIGHT: if(direct.y!=0) { direct.x=1; direct.y=0; } break; } return 0; case WM_COMMAND: wmId = LOWORD(wParam); wmEvent = HIWORD(wParam); // 分析菜单选择: switch (wmId) { case GAME_AGAIN_ID: KillTimer(hwnd, MY_TIMER); initSnake(); SetTimer(hwnd, MY_TIMER, interval, NULL); break; case PAUSE_ID: if(bPause) { bPause = false; SetWindowText(hPause, TEXT("暂停")); SetTimer(hwnd, MY_TIMER, interval, NULL); } else { bPause = true; SetWindowText(hPause, TEXT("继续")); KillTimer(hwnd, MY_TIMER); } break; case SPDUP_ID: if(interval >= 100) { interval -= 50; KillTimer(hwnd, MY_TIMER); SetTimer(hwnd, MY_TIMER, interval, NULL); } break; case SPDDOWN_ID: if(interval <= 500) { interval += 50; KillTimer(hwnd, MY_TIMER); SetTimer(hwnd, MY_TIMER, interval, NULL); } break; default: return DefWindowProc(hwnd, message, wParam, lParam); } return 0; case WM_DESTROY: KillTimer(hwnd,MY_TIMER); PostQuitMessage(0); return 0; } return DefWindowProc (hwnd, message, wParam, lParam); }
获取当前项目的URL
有一个定时器 需要每天定时访问该项目的一个链接,从而实现发送邮件提醒的功能 , 但是不能new一个 HttpServletRequest new一个之后定时器失效, init方法中需要获得URL, 下面是代码 你懂的。 package com.lawstar.mod.timer.serv; import java.io.IOException; import java.io.PrintWriter; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.lawstar.mod.timer.timers.AlarmClock; import com.lawstar.mod.timer.timers.LoadTimerConfig; import com.lawstar.mod.timer.timers.PerTimer; import com.lawstar.mod.timer.timers.TimerPojo; /** *@author 鸭梨 E-MAIL:togetyou@gmail.com *date and time:Oct 13, 2009 5:53:02 PM *comp:law-star */ public class StartTimerServ extends HttpServlet implements ServletContextListener{ /** * 销毁定时器 */ public void contextDestroyed(ServletContextEvent sce) { System.out.println("des the timer"); List<com.lawstar.mod.timer.timers.AlarmClock> listCL = (List)sce.getServletContext().getAttribute("timerList") ; System.out.println("listcl:"+listCL.size()); for(Iterator<AlarmClock> it = listCL.iterator() ;it.hasNext();){ AlarmClock al = it.next() ; al.cancel() ; System.out.println("---销毁定时器---"+al.getName()); } List<PerTimer> listPer = (List)sce.getServletContext().getAttribute("perList") ; System.out.println("listPer:"+listPer.size()); for(Iterator<PerTimer> it = listPer.iterator() ;it.hasNext();){ PerTimer al = it.next() ; al.cancel() ; System.out.println("---销毁定时器---"+al.getName()); } } public void contextInitialized(ServletContextEvent sce) { // 什么也不干 } // 每天执行的定时器的列表 private List<AlarmClock> timerList = new ArrayList<AlarmClock>(); // 间隔定时器列表 private List<PerTimer> perList = new ArrayList<PerTimer>(); public StartTimerServ() { super(); } /** * Destruction of the servlet. <br> */ public void destroy() { super.destroy(); // Just puts "destroy" string in log // Put your code here } /** * The doGet method of the servlet. <br> * * This method is called when a form has its tag value method equals to get. * * @param request the request send by the client to the server * @param response the response send by the server to the client * @throws ServletException if an error occurred * @throws IOException if an error occurred */ public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">"); out.println("<HTML>"); out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>"); out.println(" <BODY>"); out.print(" This is "); out.print(this.getClass()); out.println(", using the GET method do nothing"); out.println(" </BODY>"); out.println("</HTML>"); out.flush(); out.close(); } /** * The doPost method of the servlet. <br> * * This method is called when a form has its tag value method equals to post. * * @param request the request send by the client to the server * @param response the response send by the server to the client * @throws ServletException if an error occurred * @throws IOException if an error occurred */ public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out .println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">"); out.println("<HTML>"); out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>"); out.println(" <BODY>"); out.print(" This is "); out.print(this.getClass()); out.println(", using the POST method do nothing"); out.println(" </BODY>"); out.println("</HTML>"); out.flush(); out.close(); } /** * servlet 初始化 启动定时器 */ public void init() throws ServletException { LoadTimerConfig ltc = new LoadTimerConfig(); List<TimerPojo> ltList = ltc.getTimerList("timer.xml") ; System.out.println(ltList.size()) ; TimerPojo tpo = null ; String type = "" ; for(int i=0;i<ltList.size();i++) { tpo = ltList.get(i) ; type = tpo.getType() ; if("range".equals(type)) { PerTimer ptm = new PerTimer(tpo.getName()) ; ptm.setUrlList(tpo.getUrlList()) ; ptm.runTask(tpo.getRange()); perList.add(ptm) ; } else if("eday".equals(type)) { AlarmClock alm = new AlarmClock(tpo.getHour(),tpo.getMinute(),tpo.getSec(),tpo.getName()) ; alm.setUrlList(tpo.getUrlList()) ; alm.start() ; timerList.add(alm) ; } } this.getServletContext().setAttribute("perList", perList) ; this.getServletContext().setAttribute("timerList", timerList) ; } }
求助 小白debug不到是哪空指针了。
public class MainActivity extends Activity { private GraphicalView chart; private Timer timer = new Timer(); private TimerTask task; private Float addY; private String addX; Tool_Sqls mysql = new Tool_Sqls(); String[] xkedu = new String[20] ;//x轴数据缓冲 Float[] ycache = new Float[20]; //private final static int SERISE_NR = 1; //曲线数量 private XYSeries series;//用来清空第一个再加下一个 private XYMultipleSeriesDataset dataset1;//xy轴数据源 private XYMultipleSeriesRenderer render; SimpleDateFormat shijian = new SimpleDateFormat("hh:mm:ss"); Handler handler2; TextView guangzhi2; protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.guangzhao); //guangzhi2=(TextView)findViewById(R.id.guangzhi2); //制作曲线图 LinearLayout linearLayout = (LinearLayout)findViewById(R.id.guangzhexian); chart = ChartFactory.getLineChartView(this, getdemodataset(), getdemorenderer()); linearLayout.removeAllViews();//先remove再add可以实现统计图更新 linearLayout.addView(chart, new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); handler2 = new Handler(){ public void handleMessage(Message msg) { updatechart(); //guangzhi2.setText(String.valueOf(addY)); } }; task = new TimerTask(){ public void run() { Message msg=new Message(); msg.what=200; handler2.sendMessage(msg); } }; timer.schedule(task, 0, 2000); }//oncreate结束 //更新折线图 private void updatechart() { //判断当前点集中到底有多少点,因为屏幕总共只能容纳20个,所以当点数超过20时,长度永远是20 int length=series.getItemCount(); int a=length; if(length>20){ length=20; } // try { // if(guangzhi2.getText().toString()!=null){ // addY = Float.valueOf(guangzhi2.getText().toString());//要不要判断再说 // } // } catch (NumberFormatException e) { // e.printStackTrace(); // } addX=shijian.format(new java.util.Date()); try { mysql.getROID_4("hoestry2","id"); while (mysql.rs.next()) { addY = Float.valueOf(mysql.rs.getFloat("outlet_temperature"));//(float)(Math.random()*10); } mysql.rs.close(); mysql.stmt.close(); mysql.con.close(); } catch (SQLException e) { e.printStackTrace(); } //移除数据集中旧的点集 dataset1.removeSeries(series); if(a<20)//当数据集中不够20个点的时候直接添加就好,因为初始化的时候只有一个点,所以前几次更新的时候直接添加 { series.add(a+1, addY);//第一个参数代表第几个点,要与下面语句中的第一个参数对应 render.addXTextLabel(a+1, addX); xkedu[a]=addX; } else //超过了20个点要去除xcache【0】换成【1】的..... { //将旧的点集中x和y的数值取出来放入backup中,造成曲线向左平移的效果 for(int i =0 ;i<length-1;i++){ ycache[i]=(float) series.getY(i+1); xkedu[i]=xkedu[i+1]; } //点集先清空,为了做成新的点集而准备 series.clear(); //将新产生的点首先加入到点集中,然后在循环体中将坐标变换后的一系列点都重新加入到点集中 for(int k =0 ;k<length-1;k++){ series.add(k+1, ycache[k]); render.addXTextLabel(k+1, xkedu[k]); } xkedu[4]=addX; series.add(20, addY); render.addXTextLabel(20, addX); } //在数据集中添加新的点集 dataset1.addSeries(series); //视图更新,没有这一步,曲线不会呈现动态 chart.invalidate(); } private XYMultipleSeriesRenderer getdemorenderer() { // TODO Auto-generated method stub render = new XYMultipleSeriesRenderer(); render.setChartTitle("三新锅炉温度曲线图"); render.setChartTitleTextSize(20);//设置整个图表标题文字的大小 render.setAxisTitleTextSize(16);//设置轴标题文字的大小 render.setAxesColor(Color.BLACK); render.setXTitle("时间/hh:mm:ss"); render.setYTitle("温度/℃"); render.setLabelsTextSize(16);//设置轴刻度文字的大小 render.setLabelsColor(Color.BLACK); render.setXLabelsColor(Color.BLACK); render.setYLabelsColor(0, Color.BLACK); render.setLegendTextSize(15);//设置图例文字大小 //render.setShowLegend(false);//显示不显示在这里设置,非常完美 XYSeriesRenderer r = new XYSeriesRenderer();//设置颜色和点类型 r.setColor(Color.RED); r.setPointStyle(PointStyle.CIRCLE); r.setFillPoints(true); r.setChartValuesSpacing(3); render.addSeriesRenderer(r); render.setYLabelsAlign(Align.RIGHT);//刻度值相对于刻度的位置 render.setShowGrid(true);//显示网格 render.setYAxisMax(60);//设置y轴的范围 render.setYAxisMin(-10); render.setYLabels(20);//设置Y轴标签数 render.setDisplayChartValues(true);//设置Y轴曲线上的点的数值是否显示,实测当点数密集的时候不会全部显示,会隔一段时间显示 render.setInScroll(true); render.setLabelsTextSize(14); render.setLabelsColor(Color.BLACK); //render.getSeriesRendererAt(0).setDisplayChartValues(true); //显示折线上点的数值 render.setPanEnabled(false,false);//禁止报表的拖动 render.setPointSize(5f);//设置点的大小(图上显示的点的大小和图例中点的大小都会被设置) render.setMargins(new int[]{40,40,40,40}); //设置图形四周的留白 render.setMarginsColor(Color.WHITE); render.setXLabels(0);// 取消X坐标的数字zjk,只有自己定义横坐标是才设为此值 return render; } private XYMultipleSeriesDataset getdemodataset() { // TODO Auto-generated method stub dataset1=new XYMultipleSeriesDataset();//xy轴数据源 series = new XYSeries("矿大温度 ");//这个事是显示多条用的,显不显示在上面render设置 //这里相当于初始化,初始化中无需添加数据,因为如果这里添加第一个数据的话, //很容易使第一个数据和定时器中更新的第二个数据的时间间隔不为两秒,所以下面语句屏蔽 //这里可以一次更新五个数据,这样的话相当于开始的时候就把五个数据全部加进去了,但是数据的时间是不准确或者间隔不为二的 //for(int i=0;i<5;i++) //series.add(1, Math.random()*10);//横坐标date数据类型,纵坐标随即数等待更新 dataset1.addSeries(series); return dataset1; } public void onDestroy() { //当结束程序时关掉Timer timer.cancel(); super.onDestroy(); } } ``` ```
透明动画 怎消除前一个动画?
看着书打代码,人物的上一个动画不会消失?(假设方块是人物) ![图片说明](https://img-ask.csdn.net/upload/201708/01/1501579550_29428.png) ![图片说明](https://img-ask.csdn.net/upload/201708/01/1501579562_28390.png) //我的框架 //----------------------------------------【头文件部分】------------------------------------------------ //描述:程序依赖的头文件 1 //------------------------------------------------------------------------------------------------------ #include<Windows.h> #include<tchar.h> #pragma comment(lib,"Msimg32.lib") //----------------------------------------【宏定义部分】------------------------------------------------ //描述:定义一些辅助的宏 1 //------------------------------------------------------------------------------------------------------ #define WINDOW_WIDTH 800//窗口的宽度 #define WINDOW_HEIGHT 600//窗口的高度 #define WINDOW_TITLE L"ForMyLoverForever"//窗口标题的定义 //-------------------------------------【全局变量声明部分】--------------------------------------------- //描述:全局变量的声明 1 //------------------------------------------------------------------------------------------------------ HDC g_hdc = NULL, g_mdc = NULL, g_bufdc = NULL;//全局设备环境句柄 HBITMAP g_hSprite = NULL, g_hBackGround = NULL;//一个存人物,一个存背景 int g_iNum = 0, g_iX = 0, g_iY = 0;//g_Num变量用来记录目前显示的图号,XY记录贴图的横纵坐标 DWORD g_tPre = 0, g_tNow = 0;//声明两个变量来记录时间,g_tPre为上一次绘制的时间,g_tNow为此次准备绘制的时间 //-------------------------------------【全局函数声明部分】--------------------------------------------- //描述:全局函数的声明部分,防止“未申明的标示”错误 1 //------------------------------------------------------------------------------------------------------ LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);//窗口过程函数 BOOL Game_Init(HWND hwnd);//在此函数中进行资源初始化 VOID Game_Paint(HWND hwnd);//在此函数中进行绘图代码的书写 BOOL Game_CleanUp(HWND hwnd);//在此函数中进行资源的清理 //---------------------------------------【WinMain()函数】---------------------------------------------- //描述:Windows应用程序的入口,类似main 1 //------------------------------------------------------------------------------------------------------ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { //【1】设计一个完整的窗口类 WNDCLASSEX wndClass = { 0 };//用WINDCLASSEX定义一个窗口类 wndClass.cbSize = sizeof(WNDCLASSEX);//设置结构体的字节数大小 wndClass.style = CS_HREDRAW | CS_VREDRAW;//设置窗口的样式 wndClass.lpfnWndProc = WndProc;//设置指向窗口过程函数的指针 wndClass.cbClsExtra = 0;//窗口类的附加内存,为0就好 wndClass.cbWndExtra = 0;//窗口的附加内存,为0就好 wndClass.hInstance = hInstance;//指定的包含窗口过程的程序的事例句柄 wndClass.hIcon = (HICON)::LoadImage(NULL, L"icon.ico", IMAGE_ICON, 0, 0, LR_DEFAULTSIZE | LR_LOADFROMFILE);//加载自定义图标xxx wndClass.hCursor = LoadCursor(NULL, IDC_ARROW);//指定窗口类的光标句柄 wndClass.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH);//为hbrBackground指定一个灰色画刷句柄 wndClass.lpszMenuName = NULL;//用一个空终止字符串,指定菜单资源的名字 wndClass.lpszClassName = L"ForMyLove";//用一个以空终止的字符串,指定窗口类的名字 //【2】注册窗口类 if (!RegisterClassEx(&wndClass)) return -1; //【3】正式创建窗口 HWND hwnd = CreateWindow(L"ForMyLove", WINDOW_TITLE, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, WINDOW_WIDTH, WINDOW_HEIGHT, NULL, NULL, hInstance, NULL); //【4】窗口的移动、显示、更新 MoveWindow(hwnd, 250, 80, WINDOW_WIDTH, WINDOW_HEIGHT, true);//调整窗口显示时的位置,使它位于坐标(250,80)处 ShowWindow(hwnd, nCmdShow);//调用ShowWindow函数来显示窗口 UpdateWindow(hwnd);//对窗口进行更新 if (!Game_Init(hwnd)) { MessageBox(hwnd, L"failed", L"message", 0);//使用messagebox函数 创建一个消息窗口 return FALSE; } //【5】循环消息过程 MSG msg = { 0 };//定义并初始化msg while (msg.message != WM_QUIT)//使用while循环,如果消息不是WM_QUIT消息,就能继续循环 { if (PeekMessage(&msg, 0, 0, 0, PM_REMOVE))//查看应用程序消息队列,有消息时将队列中的消息派发出去 { TranslateMessage(&msg);//将虚拟键消息转换为字符的消息 DispatchMessage(&msg);//分发一个消息给窗口程序 } else { g_tNow = GetTickCount();//获得当前系统时间 if (g_tNow - g_tPre >= 100)//当此次循环运行与上次绘图相差0.1秒时再进行重绘 Game_Paint(hwnd); } } //【6】窗口程序的注销 UnregisterClass(L"ForMyLove", wndClass.hInstance);//程序准备结束,注销窗口 return 0; } //-------------------------------------【Game_Init()函数】-------------------------------------------------- //描述:初始化函数,进行一些简单的初始化 1 //---------------------------------------------------------------------------------------------------------- BOOL Game_Init(HWND hwnd) { HBITMAP bmp; g_hdc = GetDC(hwnd); g_mdc = CreateCompatibleDC(g_hdc); g_bufdc = CreateCompatibleDC(g_mdc); bmp = CreateCompatibleBitmap(g_hdc, WINDOW_WIDTH, WINDOW_HEIGHT);//建立一个和窗口兼容的空的位图对象 SelectObject(g_mdc, bmp); g_hSprite = (HBITMAP)LoadImage(NULL, L"3.bmp", IMAGE_BITMAP, 480, 108, LR_LOADFROMFILE); g_hBackGround = (HBITMAP)LoadImage(NULL, L"1.bmp", IMAGE_BITMAP, WINDOW_WIDTH, WINDOW_HEIGHT, LR_LOADFROMFILE); g_iX = 0; g_iY = 350; Game_Paint(hwnd); return TRUE; } //-------------------------------------【Game_Paint()函数】------------------------------------------------- //描述:绘制函数,在此函数中进行绘制操作 1 //---------------------------------------------------------------------------------------------------------- VOID Game_Paint(HWND hwnd) { //处理图号 if (g_iNum == 8)//图号是否超过最大,要是超过就定为0 g_iNum = 0; //根据图号来贴图 SelectObject(g_mdc, g_hBackGround);//选择位图 BitBlt(g_hdc, 0, 0, WINDOW_WIDTH, WINDOW_HEIGHT, g_mdc, 0, 0, SRCCOPY);//以目前窗口进行贴图 //在mdc中进行透明处理 SelectObject(g_bufdc, g_hSprite); TransparentBlt(g_mdc, g_iX, g_iY, 60, 108, g_bufdc, g_iNum * 60, 0, 60, 108, RGB(0, 0, 0));//透明色彩法 //将最后的画面显示在窗口中 BitBlt(g_hdc, 0, 0, WINDOW_WIDTH, WINDOW_HEIGHT, g_mdc, 0, 0, SRCCOPY); g_tPre = GetTickCount();//记录此次绘图时间,供下次游戏循环中判断是否达到更新时间间隔 //图号自增 g_iNum++; g_iX += 10;//计算下次贴图的坐标 //如果超过窗口边缘 就把他-60 if (g_iX >= WINDOW_WIDTH) g_iX = -60; } //--------------------------------------【Game_CleanUp()函数】---------------------------------------------- //描述:资源清理函数,在此函数中进行退出前的资源清理工作 1 //---------------------------------------------------------------------------------------------------------- BOOL Game_CleanUp(HWND hwnd) { DeleteObject(g_hBackGround); DeleteObject(g_hSprite); DeleteDC(g_mdc); DeleteDC(g_bufdc); ReleaseDC(hwnd, g_hdc); return TRUE; } //---------------------------------------【WndProc()窗口过程函数】------------------------------------------ //描述:窗口的过程函数 1 //---------------------------------------------------------------------------------------------------------- LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { PAINTSTRUCT paintStruct;//定义一个PAINTSTRUCT机构体来记录一些绘制信息 switch (message) { case WM_TIMER://定时器消息 Game_Paint(hwnd);//调用函数来绘图 break; case WM_PAINT://若是客户区重绘消息 g_hdc = BeginPaint(hwnd, &paintStruct);//指定窗口进行绘图工作的准备,并用将和绘图有关的信息填充到paintStruct结构体中 Game_Paint(hwnd); EndPaint(hwnd, &paintStruct);//EndPaint函数标记指定窗口的绘画过程结束 ValidateRect(hwnd, NULL);//更新客户区的显示 break; case WM_KEYDOWN://若是键盘按下的消息 if (wParam == VK_ESCAPE)//按下的键是ESC DestroyWindow(hwnd);//销毁窗口,发送一条WM_DESTROY的消息 break; case WM_DESTROY: Game_CleanUp(hwnd);//调用自定义的资源清理函数进行退出前的资源清理 PostQuitMessage(0);//向系统表明有个线程终止请求。用来响应WM_DESTROY消息 break; default://默认的,若与上述不符合的条件 return DefWindowProc(hwnd, message, wParam, lParam);//调用默认的窗口过程 } return 0;//正常退出 }//窗口过程函数
我用c++在做俄罗斯方块,但是出现了一个网上也没搜到的问题
为什么运行一段时间后,窗体就会变成白色了呢?这个问题我困扰了很久,不解决的话,下面我就难以实行其他功能了!我是个新手,请大家多多指教!有图有源码! #include "stdafx.h" #include "俄罗斯方块游戏2.h" #include <time.h> #define MAX_LOADSTRING 100 #define N 20 //小方块大小 HWND hWnd = NULL; #define W 600 //窗口大小 #define H 610 HGDIOBJ oldbrush; HBRUSH hb; int X1=10; int Y1=0; bool ShowTetris[30][30]={0}; class Tetris //“父类”组成大方块中的小方块 { public: POINT p[4]; public: virtual void one(HDC hdc,int x,int y){}; virtual void two(HDC hdc,int x,int y){}; virtual void three(HDC hdc,int x,int y){}; virtual void four(HDC hdc,int x,int y){}; void drawing(HDC hdc ,int x,int y); }; void Tetris::drawing(HDC hdc ,int x,int y) { POINT A[4]; for(int i=0;i<4;i++) { A[0].x = x+p[i].x*N; A[0].y = y+p[i].y*N; A[1].x = x + N+p[i].x*N; A[1].y = y+p[i].y*N; A[2].x = x + N+p[i].x*N; A[2].y = y + N+p[i].y*N; A[3].x = x+p[i].x*N; A[3].y = y + N+p[i].y*N; Polygon(hdc, A, 4); } } class T1:public Tetris //"田条" { public: void one(HDC hdc,int x,int y) { hb=CreateSolidBrush(RGB(255,2,100)); oldbrush=SelectObject(hdc,(HBRUSH)(hb)); p[0].x=0,p[0].y=0; p[1].x=1,p[1].y=0; p[2].x=0,p[2].y=1; p[3].x=1,p[3].y=1; drawing(hdc,x,y); } void two(HDC hdc,int x,int y) { hb=CreateSolidBrush(RGB(255,2,100)); oldbrush=SelectObject(hdc,(HBRUSH)(hb)); p[0].x=0,p[0].y=0; p[1].x=1,p[1].y=0; p[2].x=0,p[2].y=1; p[3].x=1,p[3].y=1; drawing(hdc,x,y); } void three(HDC hdc,int x,int y) { hb=CreateSolidBrush(RGB(255,2,100)); oldbrush=SelectObject(hdc,(HBRUSH)(hb)); p[0].x=0,p[0].y=0; p[1].x=1,p[1].y=0; p[2].x=0,p[2].y=1; p[3].x=1,p[3].y=1; drawing(hdc,x,y); } void four(HDC hdc,int x,int y) { hb=CreateSolidBrush(RGB(255,2,100)); oldbrush=SelectObject(hdc,(HBRUSH)(hb)); p[0].x=0,p[0].y=0; p[1].x=1,p[1].y=0; p[2].x=0,p[2].y=1; p[3].x=1,p[3].y=1; drawing(hdc,x,y); } };class T2:public Tetris //“竖条” { public: void one(HDC hdc,int x,int y) { hb=CreateSolidBrush(RGB(52,52,100)); oldbrush=SelectObject(hdc,(HBRUSH)(hb)); p[0].x=0,p[0].y=0; p[1].x=0,p[1].y=1; p[2].x=0,p[2].y=2; p[3].x=0,p[3].y=3; drawing(hdc,x,y); } void two(HDC hdc,int x,int y) { hb=CreateSolidBrush(RGB(52,52,100)); oldbrush=SelectObject(hdc,(HBRUSH)(hb)); p[0].x=0,p[0].y=0; p[1].x=1,p[1].y=0; p[2].x=2,p[2].y=0; p[3].x=3,p[3].y=0; drawing(hdc,x,y); } void three(HDC hdc,int x,int y) { hb=CreateSolidBrush(RGB(52,52,100)); oldbrush=SelectObject(hdc,(HBRUSH)(hb)); p[0].x=0,p[0].y=0; p[1].x=0,p[1].y=1; p[2].x=0,p[2].y=2; p[3].x=0,p[3].y=3; drawing(hdc,x,y); } void four(HDC hdc,int x,int y) { hb=CreateSolidBrush(RGB(52,52,100)); oldbrush=SelectObject(hdc,(HBRUSH)(hb)); p[0].x=0,p[0].y=0; p[1].x=1,p[1].y=0; p[2].x=2,p[2].y=0; p[3].x=3,p[3].y=0; drawing(hdc,x,y); } }; class T3:public Tetris //“T条” { public: void one(HDC hdc,int x,int y) { hb=CreateSolidBrush(RGB(95,102,100)); oldbrush=SelectObject(hdc,(HBRUSH)(hb)); p[0].x=1,p[0].y=0; p[1].x=0,p[1].y=1; p[2].x=1,p[2].y=1; p[3].x=2,p[3].y=1; drawing(hdc,x,y); } void two(HDC hdc,int x,int y) { hb=CreateSolidBrush(RGB(95,102,100)); oldbrush=SelectObject(hdc,(HBRUSH)(hb)); p[0].x=0,p[0].y=0; p[1].x=0,p[1].y=1; p[2].x=0,p[2].y=2; p[3].x=1,p[3].y=1; drawing(hdc,x,y); } void three(HDC hdc,int x,int y) { hb=CreateSolidBrush(RGB(95,102,100)); oldbrush=SelectObject(hdc,(HBRUSH)(hb)); p[0].x=1,p[0].y=0; p[1].x=0,p[1].y=0; p[2].x=1,p[2].y=1; p[3].x=2,p[3].y=0; drawing(hdc,x,y); } void four(HDC hdc,int x,int y) { hb=CreateSolidBrush(RGB(95,102,100)); oldbrush=SelectObject(hdc,(HBRUSH)(hb)); p[0].x=1,p[0].y=0; p[1].x=1,p[1].y=1; p[2].x=1,p[2].y=2; p[3].x=0,p[3].y=1; drawing(hdc,x,y); } }; class T4:public Tetris //“L形条第一种” { public: void one(HDC hdc,int x,int y) { hb=CreateSolidBrush(RGB(200,82,150)); oldbrush=SelectObject(hdc,(HBRUSH)(hb)); p[0].x=0,p[0].y=0; p[1].x=0,p[1].y=1; p[2].x=0,p[2].y=2; p[3].x=1,p[3].y=0; drawing(hdc,x,y); } void two(HDC hdc,int x,int y) { hb=CreateSolidBrush(RGB(200,82,150)); oldbrush=SelectObject(hdc,(HBRUSH)(hb)); p[0].x=0,p[0].y=0; p[1].x=1,p[1].y=0; p[2].x=2,p[2].y=0; p[3].x=2,p[3].y=1; drawing(hdc,x,y); } void three(HDC hdc,int x,int y) { hb=CreateSolidBrush(RGB(200,82,150)); oldbrush=SelectObject(hdc,(HBRUSH)(hb)); p[0].x=1,p[0].y=0; p[1].x=1,p[1].y=1; p[2].x=1,p[2].y=2; p[3].x=0,p[3].y=2; drawing(hdc,x,y); } void four(HDC hdc,int x,int y) { hb=CreateSolidBrush(RGB(200,82,150)); oldbrush=SelectObject(hdc,(HBRUSH)(hb)); p[0].x=0,p[0].y=0; p[1].x=0,p[1].y=1; p[2].x=1,p[2].y=1; p[3].x=2,p[3].y=1; drawing(hdc,x,y); } }; class T5:public Tetris //“L形条第二种” { public: void one(HDC hdc,int x,int y) { hb=CreateSolidBrush(RGB(270,152,170)); oldbrush=SelectObject(hdc,(HBRUSH)(hb)); p[0].x=1,p[0].y=0; p[1].x=0,p[1].y=0; p[2].x=1,p[2].y=1; p[3].x=1,p[3].y=2; drawing(hdc,x,y); } void two(HDC hdc,int x,int y) { hb=CreateSolidBrush(RGB(270,152,170)); oldbrush=SelectObject(hdc,(HBRUSH)(hb)); p[0].x=2,p[0].y=0; p[1].x=2,p[1].y=1; p[2].x=1,p[2].y=1; p[3].x=0,p[3].y=1; drawing(hdc,x,y); } void three(HDC hdc,int x,int y) { hb=CreateSolidBrush(RGB(270,152,170)); oldbrush=SelectObject(hdc,(HBRUSH)(hb)); p[0].x=0,p[0].y=0; p[1].x=0,p[1].y=1; p[2].x=0,p[2].y=2; p[3].x=1,p[3].y=2; drawing(hdc,x,y); } void four(HDC hdc,int x,int y) { hb=CreateSolidBrush(RGB(270,152,170)); oldbrush=SelectObject(hdc,(HBRUSH)(hb)); p[0].x=2,p[0].y=0; p[1].x=1,p[1].y=0; p[2].x=0,p[2].y=0; p[3].x=0,p[3].y=1; drawing(hdc,x,y); } }; class T6:public Tetris //“Z形条第一种” { public: void one(HDC hdc,int x,int y) { hb=CreateSolidBrush(RGB(255,252,100)); oldbrush=SelectObject(hdc,(HBRUSH)(hb)); p[0].x=0,p[0].y=0; p[1].x=1,p[1].y=0; p[2].x=1,p[2].y=1; p[3].x=2,p[3].y=1; drawing(hdc,x,y); } void two(HDC hdc,int x,int y) { hb=CreateSolidBrush(RGB(255,252,100)); oldbrush=SelectObject(hdc,(HBRUSH)(hb)); p[0].x=1,p[0].y=0; p[1].x=1,p[1].y=1; p[2].x=0,p[2].y=1; p[3].x=0,p[3].y=2; drawing(hdc,x,y); } void three(HDC hdc,int x,int y) { hb=CreateSolidBrush(RGB(255,252,100)); oldbrush=SelectObject(hdc,(HBRUSH)(hb)); p[0].x=0,p[0].y=0; p[1].x=1,p[1].y=0; p[2].x=1,p[2].y=1; p[3].x=2,p[3].y=1; drawing(hdc,x,y); } void four(HDC hdc,int x,int y) { hb=CreateSolidBrush(RGB(255,252,100)); oldbrush=SelectObject(hdc,(HBRUSH)(hb)); p[0].x=1,p[0].y=0; p[1].x=1,p[1].y=1; p[2].x=0,p[2].y=1; p[3].x=0,p[3].y=2; drawing(hdc,x,y); } }; class T7:public Tetris //“Z形条第二种” { public: void one(HDC hdc,int x,int y) { hb=CreateSolidBrush(RGB(290,255,255)); oldbrush=SelectObject(hdc,(HBRUSH)(hb)); p[0].x=1,p[0].y=0; p[1].x=2,p[1].y=0; p[2].x=1,p[2].y=1; p[3].x=0,p[3].y=1; drawing(hdc,x,y); } void two(HDC hdc,int x,int y) { hb=CreateSolidBrush(RGB(290,255,255)); oldbrush=SelectObject(hdc,(HBRUSH)(hb)); p[0].x=1,p[0].y=1; p[1].x=0,p[1].y=1; p[2].x=0,p[2].y=0; p[3].x=1,p[3].y=2; drawing(hdc,x,y); } void three(HDC hdc,int x,int y) { hb=CreateSolidBrush(RGB(290,255,255)); oldbrush=SelectObject(hdc,(HBRUSH)(hb)); p[0].x=1,p[0].y=0; p[1].x=2,p[1].y=0; p[2].x=1,p[2].y=1; p[3].x=0,p[3].y=1; drawing(hdc,x,y); } void four(HDC hdc,int x,int y) { hb=CreateSolidBrush(RGB(290,255,255)); oldbrush=SelectObject(hdc,(HBRUSH)(hb)); p[0].x=1,p[0].y=1; p[1].x=0,p[1].y=1; p[2].x=0,p[2].y=0; p[3].x=1,p[3].y=2; drawing(hdc,x,y); } }; T1 t1; T2 t2; T3 t3; T4 t4; T5 t5; T6 t6; T7 t7; Tetris *p=new Tetris; void ChooseTetris1(HDC hdc,int a) { switch(a) { case 0:p=new T1;break; case 1:p=new T2;break; case 2:p=new T3;break; case 3:p=new T4;break; case 4:p=new T5;break; case 5:p=new T6;break; case 6:p=new T7;break; default:break; } } void display(HDC hdc) { t1.one(hdc,500,10); t2.one(hdc,500,75); t3.one(hdc,500,180); t4.one(hdc,500,245); t5.one(hdc,500,325); t6.one(hdc,500,410); t7.one(hdc,500,480); } // 全局变量: HINSTANCE hInst; // 当前实例 TCHAR szTitle[MAX_LOADSTRING]; // 标题栏文本 TCHAR szWindowClass[MAX_LOADSTRING]; // 主窗口类名 // 此代码模块中包含的函数的前向声明: ATOM MyRegisterClass(HINSTANCE hInstance); BOOL InitInstance(HINSTANCE, int); LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM); int R; int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { UNREFERENCED_PARAMETER(hPrevInstance); UNREFERENCED_PARAMETER(lpCmdLine); // TODO: 在此放置代码。 MSG msg; HACCEL hAccelTable; R=rand()%7; // 初始化全局字符串 LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING); LoadString(hInstance, IDC_MY2CPP, szWindowClass, MAX_LOADSTRING); MyRegisterClass(hInstance); srand((unsigned)time(NULL)); // 执行应用程序初始化: if (!InitInstance (hInstance, nCmdShow)) { return FALSE; } hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_MY2CPP)); // 主消息循环: while (GetMessage(&msg, NULL, 0, 0)) { if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } } return (int) msg.wParam; } // // 函数: MyRegisterClass() // // 目的: 注册窗口类。 // // 注释: // // 仅当希望 // 此代码与添加到 Windows 95 中的“RegisterClassEx” // 函数之前的 Win32 系统兼容时,才需要此函数及其用法。调用此函数十分重要, // 这样应用程序就可以获得关联的 // “格式正确的”小图标。 // ATOM MyRegisterClass(HINSTANCE hInstance) { WNDCLASSEX wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc = WndProc; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = hInstance; wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_MY2CPP)); wcex.hCursor = LoadCursor(NULL, IDC_ARROW); wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wcex.lpszMenuName = MAKEINTRESOURCE(IDC_MY2CPP); wcex.lpszClassName = szWindowClass; wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL)); return RegisterClassEx(&wcex); } // // 函数: InitInstance(HINSTANCE, int) // // 目的: 保存实例句柄并创建主窗口 // // 注释: // // 在此函数中,我们在全局变量中保存实例句柄并 // 创建和显示主程序窗口。 // BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) { HWND hWnd; hInst = hInstance; // 将实例句柄存储在全局变量中 hWnd = CreateWindow(szWindowClass, L"Tetris",WS_CAPTION|WS_SYSMENU, CW_USEDEFAULT,CW_USEDEFAULT, W,H, NULL, NULL, hInstance, NULL); if (!hWnd) { return FALSE; } ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); return TRUE; } int a=0; int X[1000]; int Y[1000]; int JudgeTetris() { for(int i=0;i<4;i++) { if(p->p[i].y+Y1+1>=28) return 0; } for(int i=0;i<4;i++) { for(int j=0;j<a;j++) { if(p->p[i].y+Y1+1>=Y[j]&&p->p[i].x+X1==X[j]) { return 0; } } } return 1; } void StopTetris() { int x, y; for(int i=0;i<4;i++) { x=X1+p->p[i].x; y=Y1+p->p[i].y; // ShowTetris[x][y] = true; X[a]=x; Y[a]=y; ShowTetris[X[a]][Y[a]] = true; a++; } } void Down(HDC hdc,int n) { switch(n) { case 0: p->one(hdc,X1*N,Y1*N);break; case 1: p->two(hdc,X1*N,Y1*N);break; case 2: p->three(hdc,X1*N,Y1*N);break; case 3: p->four(hdc,X1*N,Y1*N);break; default:break; } if(JudgeTetris()) { Y1++; } else { StopTetris(); R=rand()%7; delete p; //到达低端时,随机选择一个数 ChooseTetris1(hdc,R); Y1=0; X1=10; } for (int i = 0; i < 30; i++) { for (int j = 0; j < 30; j++) { if (ShowTetris[i][j]) { hb=CreateSolidBrush(RGB(34,139,34)); oldbrush=SelectObject(hdc,(HBRUSH)(hb)); POINT a[4] = { i*N, j*N, (i + 1)*N, j*N, (i + 1)*N, (j + 1)*N, i*N, (j+1)*N }; Polygon(hdc, a, 4); } } } } void QuickDown(HDC hdc) { Y1+=1; InvalidateRect(hWnd,NULL,TRUE); } void GoLeft(HDC hdc) { if(X1<=0) { X1-=0; } else X1-=1; InvalidateRect(hWnd,NULL,TRUE); } int JR() //判断右边界 { for(int i=0;i<4;i++) { if(p->p[i].x+X1>=20) return 0; } return 1; } void GoRight(HDC hdc) { if(!JR()) { X1+=0; } else X1+=1; InvalidateRect(hWnd,NULL,TRUE); } int L=0; void Deforming(HDC hdc) { L+=1; L=L%4; InvalidateRect(hWnd,NULL,TRUE); } // 函数: WndProc(HWND, UINT, WPARAM, LPARAM) // // 目的: 处理主窗口的消息。 // // WM_COMMAND - 处理应用程序菜单 // WM_PAINT - 绘制主窗口 // WM_DESTROY - 发送退出消息并返回 // // LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { int wmId, wmEvent; PAINTSTRUCT ps; HDC hdc; HGDIOBJ oldbrush; HBRUSH hb; RECT rect; srand((unsigned)time(NULL)); switch (message) { case WM_COMMAND: wmId = LOWORD(wParam); wmEvent = HIWORD(wParam); // 分析菜单选择: switch (wmId) { case IDM_ABOUT: DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About); break; case IDM_EXIT: DestroyWindow(hWnd); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } break; case WM_CREATE: SetTimer(hWnd,1,700,NULL); //函数反回值就是第一个参数值1,表示此定时器的ID号;第二个参数表示要等待700毫秒时间再重新处理一次。第三个参数在这种方法中一般用NULL。 case WM_TIMER: InvalidateRect(hWnd,NULL,TRUE); case WM_KEYDOWN: //键盘控制方块移动 hdc=GetDC(hWnd); switch((int)wParam) { case VK_DOWN: QuickDown(hdc);break; //加速下落 case VK_LEFT: GoLeft(hdc);break; //键盘左移 case VK_RIGHT: GoRight(hdc);break; //键盘右移 case VK_UP: Deforming(hdc);break; //变形 } ReleaseDC ( hWnd,hdc ); return 0; case WM_PAINT: hdc = BeginPaint(hWnd, &ps); ChooseTetris1(hdc,R); hb=CreateSolidBrush(RGB(255,228,181));//hb=CreateSolidBrush(RGB(255,192,250)); oldbrush=SelectObject(hdc,(HBRUSH)(hb)); Rectangle(hdc,0,0,420,560); //游戏区域画刷 hb=CreateSolidBrush(RGB(176,224,230));//hb=CreateSolidBrush(RGB(255,192,250)); oldbrush=SelectObject(hdc,(HBRUSH)(hb)); Rectangle(hdc,420,0,600,560); //游戏区域画刷 display(hdc); Down(hdc,L); // TODO: 在此添加任意绘图代码... EndPaint(hWnd, &ps); break; case WM_DESTROY: KillTimer (hWnd, 1) ; PostQuitMessage(0); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; } // “关于”框的消息处理程序。 INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { UNREFERENCED_PARAMETER(lParam); switch (message) { case WM_INITDIALOG: return (INT_PTR)TRUE; case WM_COMMAND: if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) { EndDialog(hDlg, LOWORD(wParam)); return (INT_PTR)TRUE; } break; }![图片](https://img-ask.csdn.net/upload/201605/23/1464003773_584645.jpg)![图片](https://img-ask.csdn.net/upload/201605/23/1464003943_873881.jpg)![图片](https://img-ask.csdn.net/upload/201605/23/1464004017_919643.jpg)
如何修改程序使单片机工作周期缩短至一秒内
#include "reg51.h" #include<stdio.h> #include<intrins.h> //打开头文件 #define uint8 unsigned char #define uint16 unsigned int #define uchar unsigned char #define uint unsigned int //宏定义 uint16 cnt2ms; //10ms计数器 uint8 cnt1s; //1秒计数器 //电阻-------------------------------- #define Z1 13700053.00 #define Z2 3685279.00 float RZ=0; unsigned long RX=0; unsigned long RX2=0; unsigned long RX3=0; unsigned long RX4=0; unsigned long RX5=0; unsigned long RX6=0; unsigned long RX7=0; unsigned long RX8=0; unsigned long RX9=0; //电感-------------------------------- float LZ=0; #define C1 0.0461 //电容-------------------------------- float CZ=0; float CX=0; #define R1 24874 uint8 KL=0; // unsigned int Pulsecnt=0; //脉冲个数 unsigned int Pulsenum; //脉冲个数 uint8 start=0; // uint16 PulseTime; //10ms计数器 uint16 Pulse; //10ms计数器 bit flag=0; uint8 CH=0; // unsigned long x; void Init_Extint(void); void TimerInitProc(); void Init_System(void); void Display(uint8 chose_dat, uint8 dat); void ShowDisp(uint8 tPulsenum, uint8 tPulsecnt, uint8 tcnt1s); void DelayMs(uint8 Ms); uint8 Pulse_FLAG=0; uint8 Pulse_5=0; /********************************LCD液晶**************************************/ #define LCD_Data P0 //LCD的数据口 sbit LCD_BF=LCD_Data^7; //LCD忙信号位 sbit LCD_RS=P2^5; sbit LCD_RW=P2^6; sbit LCD_EN=P2^7; #define LCD_GO_HOME 0x02 //AC=0,光标、画面回HOME位 //输入方式设置 #define LCD_AC_AUTO_INCREMENT 0x06 //数据读、写操作后,AC自动增一 #define LCD_AC_AUTO_DECREASE 0x04 //数据读、写操作后,AC自动减一 #define LCD_MOVE_ENABLE 0x05 //数据读、写操作,画面平移 #define LCD_MOVE_DISENABLE 0x04 //数据读、写操作,画面不动 //设置显示、光标及闪烁开、关 #define LCD_DISPLAY_ON 0x0C //显示开 #define LCD_DISPLAY_OFF 0x08 //显示关 #define LCD_CURSOR_ON 0x0A //光标显示 #define LCD_CURSOR_OFF 0x08 //光标不显示 #define LCD_CURSOR_BLINK_ON 0x09 //光标闪烁 #define LCD_CURSOR_BLINK_OFF 0x08 //光标不闪烁 //光标、画面移动,不影响DDRAM #define LCD_LEFT_MOVE 0x18 //LCD显示左移一位 #define LCD_RIGHT_MOVE 0x1C //LCD显示右移一位 #define LCD_CURSOR_LEFT_MOVE 0x10 //光标左移一位 #define LCD_CURSOR_RIGHT_MOVE 0x14 //光标右移一位 //工作方式设置 #define LCD_DISPLAY_DOUBLE_LINE 0x38 //两行显示 #define LCD_DISPLAY_SINGLE_LINE 0x30 //单行显示 /*定义子程序*/ void LCD_ClrAll(void); //清屏 void Judge_LCD_busy(void); //检测是否忙碌 void LCD_Write(uchar WriteData); //写控制字 void LCD_write_data(uchar LCD_data); //写数据显示 void LCD_cursor(uchar x); //光标起始地址 void LCD_printc(unsigned char lcd_data) ; //输出一个字符 void LCD_prints(unsigned char *lcd_string);//输出字符串 /*LCD1602忙碌判断子程序*/ void Judge_LCD_busy(void) //判断LCD1602是否忙状态 { while(1) { LCD_EN=0; LCD_RS=0; LCD_RW=1; LCD_Data=0xff; LCD_EN=1; //EN 是 1—0 使能 if(!LCD_BF)break; //LCD_BF=1表示忙碌,需要等待。 } LCD_EN=0; } /******LCD清屏***************/ void LCD_ClrAll(void) { Judge_LCD_busy(); //判断是否忙碌 LCD_RS=0; LCD_RW=0; LCD_Data=0x01; LCD_EN=1; LCD_EN=0; } /*******LCD写数据定义各种模式*********/ void LCD_Write(uchar WriteData) //写指令到LCD { Judge_LCD_busy(); LCD_RS=0; LCD_RW=0; P0=WriteData; //把WriteData的数据送到数据口 LCD_EN=1; LCD_EN=0; } /********LCD显示数据***********/ void LCD_write_data(uchar LCD_data) //输出一个字节数据到LCD { Judge_LCD_busy(); LCD_RS=1; LCD_RW=0; P0=LCD_data; LCD_EN=1; LCD_EN=0; } /****光标位置的确定***/ void LCD_cursor(uchar x) //LCD光标定位到x处 { LCD_Write(0x80+x); //第一行地址是0x80 } /*输出一个字符*/ void LCD_printc(unsigned char lcd_data) { LCD_write_data(lcd_data); } /*输出字符串*/ void LCD_prints(unsigned char *lcd_string) { unsigned char i=0; while(lcd_string[i]!=0x00) { LCD_write_data(lcd_string[i]); i++; } } /*初始化程序*/ void LCD_initial(void) //初始化LCD { LCD_Write(LCD_AC_AUTO_INCREMENT|LCD_MOVE_DISENABLE); LCD_Write(LCD_DISPLAY_ON|LCD_CURSOR_OFF); LCD_Write(LCD_DISPLAY_DOUBLE_LINE); LCD_ClrAll(); } /****延时******/ void delay_1ms(uint x) { uint j; uchar i; for(j=0;j<x;j++) { for(i=0;i<120;i++); } } void Value_to_ASCII(unsigned long value,uchar add) { unsigned char temp[] = "0000.000K "; temp[0] = value/1000000 + 0x30;//数值改成字符,液晶显示需要ASCII码 value = value%1000000; temp[1] = value/100000 + 0x30; value = value%100000; temp[2] = value/10000 + 0x30; value = value%10000; temp[3] = value/1000 + 0x30; value = value%1000; temp[5] = value/100 + 0x30; value = value%100; temp[6] = value/10 + 0x30; value = value%10; temp[7] = value + 0x30; LCD_cursor(add); //光标起始地址 ,第一行地址是0x00~0x0F,第二行地址是0x40~0x4f LCD_prints(temp); } //--------------------主程序-------------------------------- void main() { TMOD=0x51; //设置定时器0,方式1:16位定时器 TH1=0; TL1=0; TH0=(65536-2000)/256; //设定定时周期 TL0=(65536-2000)%256; TR0=1; //打开定时器0 TR1=1; //打开定时器1 ET1=1; ET0=1; EA=1; //打开总中断 LCD_initial(); delay_1ms(50); LCD_initial(); delay_1ms(50); LCD_cursor(0x00); LCD_prints(" MEASURE Rx "); LCD_cursor(0x45); while(1) { if(flag==1) { flag=0; x=Pulsenum*65536+TH1*256+TL1;//计算1s内的脉冲个数,频率=脉冲个数 RZ=(Z1/x);//测量100到1000 RX=RZ-1000; RX=RX>>1; if(RX>=1005){ RX=RX-1005;}else{RX=0;} if(x==0){RX=0;RX2=0;RX3=0;RX4=0;RX5=0;RX6=0;RX7=0;RX8=0;RX9=0;} if(RX>1000000){RX=1000000; } RX2=(RX+RX3+RX4+RX5+RX6+RX7+RX8+RX9)>>3;//求平均提高精度 RX9=RX8;RX8=RX7;RX7=RX6;RX6=RX5;RX5=RX4;RX4=RX3;RX3=RX; //保存上一次的阻值 Value_to_ASCII(RX2,0x44);//更新阻值显示 cnt2ms=0; Pulsenum=0; TH1=0; TL1=0; TR1=1; } } } /******************************************************************************* * 函 数 名: Exti0_interrupt * 函数功能: /T0引脚下降沿进入中断 * 入口参数: 无 * 返 回: 无 *******************************************************************************/ void T1_interrupt(void) interrupt 3 using 0 { Pulsenum++; //保存测得脉冲值 } /******************************************************************** 函数功能:定时器/计数器1中断处理 入口参数:null 返 回:null 备 注:null ********************************************************************/ void Timer0IntProc() interrupt 1 using 0 //2ms { TH0=(65536-2000)/256; TL0=(65536-2000)%256; cnt2ms++; if(cnt2ms==497) //1s计时到 { TR1=0; cnt2ms = 0; flag=1; } }
swing表格
需求:我要用swing做一个表格显示数据库中的部分数据,数据库中的数据是在不停变化的,我需要界面显示的数据和数据库中的数据同步,请问以前做过的给个思路最好贴点关键代码,拜托了!!! 代码:这是我的部分代码,定时器方法循环执行6次,程序就死了,不知道是为什么,请大家也帮忙看下 package com.rfid.view; import javax.swing.JDesktopPane; import javax.swing.JButton; import javax.swing.ListSelectionModel; import javax.swing.Timer; import java.awt.Rectangle; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.util.HashMap; import java.util.List; import com.rfid.rw.RReader; import com.rfid.rw.RfidDAO; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.table.DefaultTableModel; import javax.swing.table.TableModel; public class RfidConsole extends JDesktopPane implements ActionListener { private static final long serialVersionUID = 1L; private JButton jButton = null; private JButton jButton2 = null; private JScrollPane jScrollPane = null; private JTable jTable = null; private JButton jButton1 = null; private static HashMap<String, RReader> hashmap = new HashMap<String, RReader>(); private RfidDAO dao; private TableModel tableModel; // @jve:decl-index=0: // [color=red]定时器方法[/color] public void actionPerformed(ActionEvent e) { // 更新表格模型中的数据 tableModel = getTableModel(); jTable.repaint(); System.out.println("run"); } // 默认构造函数 public RfidConsole() { this.dao = new RfidDAO(); initialize(); Timer timer = new Timer(3000, this); timer.start(); } // 默认初始化方法 private void initialize() { setSize(404, 301); add(getJButton(), null); add(getJButton2(), null); getJButton().setEnabled(false); getJButton2().setEnabled(false); List<RReader> list = dao.getRfids(); for (int i = 0; i < list.size(); i++) { RReader rfid = (RReader) list.get(i); rfid.setPort(49380); rfid.setConsle(this); /* * if (rfid.startR()) { RfidConsole.hashmap.put(rfid.getId(), rfid); * dao.updateFlag(rfid.getId(), 1); } else { * dao.updateFlag(rfid.getId(), 3); } */ } // getJTable(getTableModel()); add(getJTable(getTableModel()), null); add(getJScrollPane(), null); this.add(getJButton1(), null); } /** * This method initializes jButton 启动按钮 * * @return javax.swing.JButton */ private JButton getJButton() { if (jButton == null) { jButton = new JButton(); jButton.setBounds(new Rectangle(29, 19, 60, 28)); jButton.setText("启动"); jButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { int srow = jTable.getSelectedRow(); if (srow != -1) { String id = (String) jTable.getValueAt(srow, 1); RReader rfid = RfidConsole.hashmap.get(id); // rfid.startR(); RfidConsole.hashmap.put(id, rfid); dao.updateFlag(id, 1); System.out.println("启动了:" + rfid.getName()); buttonControl(1, srow); } } }); } return jButton; } /** * This method initializes jButton2 停止按钮 * * @return javax.swing.JButton */ private JButton getJButton2() { if (jButton2 == null) { jButton2 = new JButton(); jButton2.setBounds(new Rectangle(106, 17, 61, 30)); jButton2.setText("停止"); jButton2.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { int srow = jTable.getSelectedRow(); if (srow != -1) { String id = (String) jTable.getValueAt(srow, 1); RReader rfid = RfidConsole.hashmap.get(id); dao.updateFlag(id, 0); System.out.println("关闭了:" + rfid.getName()); buttonControl(0, srow); // rfid.stopR(); } } }); } return jButton2; } /** * This method initializes jScrollPane 存放table的pane * * @return javax.swing.JScrollPane */ private JScrollPane getJScrollPane() { if (jScrollPane == null) { jScrollPane = new JScrollPane(); jScrollPane.setBounds(new Rectangle(26, 60, 355, 178)); jScrollPane.setViewportView(jTable); } return jScrollPane; } /** * This method initializes jTable 表格数据 * * @return javax.swing.JTable */ public TableModel getTableModel() { List list = dao.getRfids(); int size = list.size(); String[] column_names = { "序号", "编号", "名称", "IP", "状态", "信号" }; tableModel = new DefaultTableModel(column_names, size); for (int i = 0; i < size; i++) { RReader rfid = (RReader) list.get(i); tableModel.setValueAt(i + 1, i, 0); tableModel.setValueAt(rfid.getId(), i, 1); tableModel.setValueAt(rfid.getName(), i, 2); tableModel.setValueAt(rfid.getIp(), i, 3); if (1 == rfid.getFlg()) { tableModel.setValueAt("已启动", i, 4); } else if (0 == rfid.getFlg()) { tableModel.setValueAt("已停止", i, 4); } else { tableModel.setValueAt("设备未连接", i, 4); } } return tableModel; } /** 表格 */ public JTable getJTable(TableModel tablemodel) { if (jTable == null) { jTable = new JTable(tablemodel); jTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); jTable.addMouseListener(new MouseAdapter() { public void mouseReleased(MouseEvent e) { if (!e.isShiftDown()) { int srow = jTable.getSelectedRow(); String id = (String) jTable.getValueAt(srow, 1); RReader rfid = dao.getRfid(id); int flag = rfid.getFlg(); buttonControl(flag, srow); } } }); } return jTable; } public JTable getJTable() { return jTable; } /** * 控制界面按钮 0:启动按钮可用 1:关闭按钮可用 其它:启动关闭按钮都不可用 * */ public void buttonControl(int flag, int row) { TableModel tablemodel = jTable.getModel(); if (flag == 0) { jButton.setEnabled(true); jButton2.setEnabled(false); tablemodel.setValueAt("已关闭", row, 4); } else if (flag == 1) { jButton.setEnabled(false); jButton2.setEnabled(true); tablemodel.setValueAt("已启动", row, 4); } else { jButton.setEnabled(false); jButton2.setEnabled(false); } } /** * This method initializes jButton1 * * @return javax.swing.JButton */ public JButton getJButton1() { if (jButton1 == null) { jButton1 = new JButton(); jButton1.setBounds(new Rectangle(345, 29, 17, 16)); } return jButton1; } }
《MySQL 性能优化》之理解 MySQL 体系结构
本文介绍 MySQL 的体系结构,包括物理结构、逻辑结构以及插件式存储引擎。
程序员请照顾好自己,周末病魔差点一套带走我。
程序员在一个周末的时间,得了重病,差点当场去世,还好及时挽救回来了。
卸载 x 雷某度!GitHub 标星 1.5w+,从此我只用这款全能高速下载工具!
作者 | Rocky0429 来源 | Python空间 大家好,我是 Rocky0429,一个喜欢在网上收集各种资源的蒟蒻… 网上资源眼花缭乱,下载的方式也同样千奇百怪,比如 BT 下载,磁力链接,网盘资源等等等等,下个资源可真不容易,不一样的方式要用不同的下载软件,因此某比较有名的 x 雷和某度网盘成了我经常使用的工具。 作为一个没有钱的穷鬼,某度网盘几十 kb 的下载速度让我...
Python+OpenCV实时图像处理
目录 1、导入库文件 2、设计GUI 3、调用摄像头 4、实时图像处理 4.1、阈值二值化 4.2、边缘检测 4.3、轮廓检测 4.4、高斯滤波 4.5、色彩转换 4.6、调节对比度 5、退出系统 初学OpenCV图像处理的小伙伴肯定对什么高斯函数、滤波处理、阈值二值化等特性非常头疼,这里给各位分享一个小项目,可通过摄像头实时动态查看各类图像处理的特点,也可对各位调参、测试...
2020年一线城市程序员工资大调查
人才需求 一线城市共发布岗位38115个,招聘120827人。 其中 beijing 22805 guangzhou 25081 shanghai 39614 shenzhen 33327 工资分布 2020年中国一线城市程序员的平均工资为16285元,工资中位数为14583元,其中95%的人的工资位于5000到20000元之间。 和往年数据比较: yea...
为什么猝死的都是程序员,基本上不见产品经理猝死呢?
相信大家时不时听到程序员猝死的消息,但是基本上听不到产品经理猝死的消息,这是为什么呢? 我们先百度搜一下:程序员猝死,出现将近700多万条搜索结果: 搜索一下:产品经理猝死,只有400万条的搜索结果,从搜索结果数量上来看,程序员猝死的搜索结果就比产品经理猝死的搜索结果高了一倍,而且从下图可以看到,首页里面的五条搜索结果,其实只有两条才是符合条件。 所以程序员猝死的概率真的比产品经理大,并不是错...
害怕面试被问HashMap?这一篇就搞定了!
声明:本文以jdk1.8为主! 搞定HashMap 作为一个Java从业者,面试的时候肯定会被问到过HashMap,因为对于HashMap来说,可以说是Java集合中的精髓了,如果你觉得自己对它掌握的还不够好,我想今天这篇文章会非常适合你,至少,看了今天这篇文章,以后不怕面试被问HashMap了 其实在我学习HashMap的过程中,我个人觉得HashMap还是挺复杂的,如果真的想把它搞得明明白...
毕业5年,我问遍了身边的大佬,总结了他们的学习方法
我问了身边10个大佬,总结了他们的学习方法,原来成功都是有迹可循的。
python爬取百部电影数据,我分析出了一个残酷的真相
2019年就这么匆匆过去了,就在前几天国家电影局发布了2019年中国电影市场数据,数据显示去年总票房为642.66亿元,同比增长5.4%;国产电影总票房411.75亿元,同比增长8.65%,市场占比 64.07%;城市院线观影人次17.27亿,同比增长0.64%。 看上去似乎是一片大好对不对?不过作为一名严谨求实的数据分析师,我从官方数据中看出了一点端倪:国产票房增幅都已经高达8.65%了,为什...
推荐10个堪称神器的学习网站
每天都会收到很多读者的私信,问我:“二哥,有什么推荐的学习网站吗?最近很浮躁,手头的一些网站都看烦了,想看看二哥这里有什么新鲜货。” 今天一早做了个恶梦,梦到被老板辞退了。虽然说在我们公司,只有我辞退老板的份,没有老板辞退我这一说,但是还是被吓得 4 点多都起来了。(主要是因为我掌握着公司所有的核心源码,哈哈哈) 既然 4 点多起来,就得好好利用起来。于是我就挑选了 10 个堪称神器的学习网站,推...
这些软件太强了,Windows必装!尤其程序员!
Windows可谓是大多数人的生产力工具,集娱乐办公于一体,虽然在程序员这个群体中都说苹果是信仰,但是大部分不都是从Windows过来的,而且现在依然有很多的程序员用Windows。 所以,今天我就把我私藏的Windows必装的软件分享给大家,如果有一个你没有用过甚至没有听过,那你就赚了????,这可都是提升你幸福感的高效率生产力工具哦! 走起!???? NO、1 ScreenToGif 屏幕,摄像头和白板...
阿里面试,面试官没想到一个ArrayList,我都能跟他扯半小时
我是真的没想到,面试官会这样问我ArrayList。
曾经优秀的人,怎么就突然不优秀了。
职场上有很多辛酸事,很多合伙人出局的故事,很多技术骨干被裁员的故事。说来模板都类似,曾经是名校毕业,曾经是优秀员工,曾经被领导表扬,曾经业绩突出,然而突然有一天,因为种种原因,被裁员了,...
大学四年因为知道了这32个网站,我成了别人眼中的大神!
依稀记得,毕业那天,我们导员发给我毕业证的时候对我说“你可是咱们系的风云人物啊”,哎呀,别提当时多开心啦????,嗯,我们导员是所有导员中最帅的一个,真的???? 不过,导员说的是实话,很多人都叫我大神的,为啥,因为我知道这32个网站啊,你说强不强????,这次是绝对的干货,看好啦,走起来! PS:每个网站都是学计算机混互联网必须知道的,真的牛杯,我就不过多介绍了,大家自行探索,觉得没用的,尽管留言吐槽吧???? 社...
良心推荐,我珍藏的一些Chrome插件
上次搬家的时候,发了一个朋友圈,附带的照片中不小心暴露了自己的 Chrome 浏览器插件之多,于是就有小伙伴评论说分享一下我觉得还不错的浏览器插件。 我下面就把我日常工作和学习中经常用到的一些 Chrome 浏览器插件分享给大家,随便一个都能提高你的“生活品质”和工作效率。 Markdown Here Markdown Here 可以让你更愉快的写邮件,由于支持 Markdown 直接转电子邮...
看完这篇HTTP,跟面试官扯皮就没问题了
我是一名程序员,我的主要编程语言是 Java,我更是一名 Web 开发人员,所以我必须要了解 HTTP,所以本篇文章就来带你从 HTTP 入门到进阶,看完让你有一种恍然大悟、醍醐灌顶的感觉。 最初在有网络之前,我们的电脑都是单机的,单机系统是孤立的,我还记得 05 年前那会儿家里有个电脑,想打电脑游戏还得两个人在一个电脑上玩儿,及其不方便。我就想为什么家里人不让上网,我的同学 xxx 家里有网,每...
剑指Offer对答如流系列 - 重建二叉树
面试题6:重建二叉树 题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建出图2.6所示的二叉树并输出它的头结点。二叉树结点的定义如下: class TreeNode{ int val; TreeNode l...
史上最全的IDEA快捷键总结
现在Idea成了主流开发工具,这篇博客对其使用的快捷键做了总结,希望对大家的开发工作有所帮助。
阿里程序员写了一个新手都写不出的低级bug,被骂惨了。
这种新手都不会范的错,居然被一个工作好几年的小伙子写出来,差点被当场开除了。
谁是华为扫地僧?
是的,华为也有扫地僧!2020年2月11-12日,“养在深闺人不知”的华为2012实验室扫地僧们,将在华为开发者大会2020(Cloud)上,和大家见面。到时,你可以和扫地僧们,吃一个洋...
AI 没让人类失业,搞 AI 的人先失业了
最近和几个 AI 领域的大佬闲聊 根据他们讲的消息和段子 改编出下面这个故事 如有雷同 都是巧合 1. 老王创业失败,被限制高消费 “这里写我跑路的消息实在太夸张了。” 王葱葱哼笑一下,把消息分享给群里。 阿杰也看了消息,笑了笑。在座几位也都笑了。 王葱葱是个有名的人物,21岁那年以全额奖学金进入 KMU 攻读人工智能博士,累计发表论文 40 余篇,个人技术博客更是成为深度学习领域内风向标。 ...
2020年,冯唐49岁:我给20、30岁IT职场年轻人的建议
点击“技术领导力”关注∆每天早上8:30推送 作者|Mr.K 编辑| Emma 来源|技术领导力(ID:jishulingdaoli) 前天的推文《冯唐:职场人35岁以后,方法论比经验重要》,收到了不少读者的反馈,觉得挺受启发。其实,冯唐写了不少关于职场方面的文章,都挺不错的。可惜大家只记住了“春风十里不如你”、“如何避免成为油腻腻的中年人”等不那么正经的文章。 本文整理了冯...
一份王者荣耀的英雄数据报告
咪哥杂谈本篇阅读时间约为 6 分钟。1前言前一阵写了关于王者的一些系列文章,从数据的获取到数据清洗,数据落地,都是为了本篇的铺垫。今天来实现一下,看看不同维度得到的结论。2环境准备本次实...
作为一名大学生,如何在B站上快乐的学习?
B站是个宝,谁用谁知道???? 作为一名大学生,你必须掌握的一项能力就是自学能力,很多看起来很牛X的人,你可以了解下,人家私底下一定是花大量的时间自学的,你可能会说,我也想学习啊,可是嘞,该学习啥嘞,不怕告诉你,互联网时代,最不缺的就是学习资源,最宝贵的是啥? 你可能会说是时间,不,不是时间,而是你的注意力,懂了吧! 那么,你说学习资源多,我咋不知道,那今天我就告诉你一个你必须知道的学习的地方,人称...
那些年,我们信了课本里的那些鬼话
教材永远都是有错误的,从小学到大学,我们不断的学习了很多错误知识。 斑羚飞渡 在我们学习的很多小学课文里,有很多是错误文章,或者说是假课文。像《斑羚飞渡》: 随着镰刀头羊的那声吼叫,整个斑羚群迅速分成两拨,老年斑羚为一拨,年轻斑羚为一拨。 就在这时,我看见,从那拨老斑羚里走出一只公斑羚来。公斑羚朝那拨年轻斑羚示意性地咩了一声,一只半大的斑羚应声走了出来。一老一少走到伤心崖,后退了几步,突...
一个程序在计算机中是如何运行的?超级干货!!!
强烈声明:本文很干,请自备茶水!???? 开门见山,咱不说废话! 你有没有想过,你写的程序,是如何在计算机中运行的吗?比如我们搞Java的,肯定写过这段代码 public class HelloWorld { public static void main(String[] args) { System.out.println("Hello World!"); } ...
【蘑菇街技术部年会】程序员与女神共舞,鼻血再次没止住。(文末内推)
蘑菇街技术部的年会,别开生面,一样全是美女。
那个在阿里养猪的工程师,5年了……
简介: 在阿里,走过1825天,没有趴下,依旧斗志满满,被称为“五年陈”。他们会被授予一枚戒指,过程就叫做“授戒仪式”。今天,咱们听听阿里的那些“五年陈”们的故事。 下一个五年,猪圈见! 我就是那个在养猪场里敲代码的工程师,一年多前我和20位工程师去了四川的猪场,出发前总架构师慷慨激昂的说:同学们,中国的养猪产业将因为我们而改变。但到了猪场,发现根本不是那么回事:要个WIFI,没有;...
为什么程序猿都不愿意去外包?
分享外包的组织架构,盈利模式,亲身经历,以及根据一些外包朋友的反馈,写了这篇文章 ,希望对正在找工作的老铁有所帮助
Java校招入职华为,半年后我跑路了
何来 我,一个双非本科弟弟,有幸在 19 届的秋招中得到前东家华为(以下简称 hw)的赏识,当时秋招签订就业协议,说是入了某 java bg,之后一系列组织架构调整原因等等让人无法理解的神操作,最终毕业前夕,被通知调往其他 bg 做嵌入式开发(纯 C 语言)。 由于已至于校招末尾,之前拿到的其他 offer 又无法再收回,一时感到无力回天,只得默默接受。 毕业后,直接入职开始了嵌入式苦旅,由于从未...
世界上有哪些代码量很少,但很牛逼很经典的算法或项目案例?
点击上方蓝字设为星标下面开始今天的学习~今天分享四个代码量很少,但很牛逼很经典的算法或项目案例。1、no code 项目地址:https://github.com/kelseyhight...
​两年前不知如何编写代码的我,现在是一名人工智能工程师
全文共3526字,预计学习时长11分钟 图源:Unsplash 经常有小伙伴私信给小芯,我没有编程基础,不会写代码,如何进入AI行业呢?还能赶上AI浪潮吗? 任何时候努力都不算晚。 下面,小芯就给大家讲一个朋友的真实故事,希望能给那些处于迷茫与徘徊中的小伙伴们一丝启发。(下文以第一人称叙述) 图源:Unsplash 正如Elsa所说,职业转换是...
强烈推荐10本程序员必读的书
很遗憾,这个春节注定是刻骨铭心的,新型冠状病毒让每个人的神经都是紧绷的。那些处在武汉的白衣天使们,尤其值得我们的尊敬。而我们这些窝在家里的程序员,能不外出就不外出,就是对社会做出的最大的贡献。 有些读者私下问我,窝了几天,有点颓丧,能否推荐几本书在家里看看。我花了一天的时间,挑选了 10 本我最喜欢的书,你可以挑选感兴趣的来读一读。读书不仅可以平复恐惧的压力,还可以对未来充满希望,毕竟苦难终将会...
非典逼出了淘宝和京东,新冠病毒能够逼出什么?
loonggg读完需要5分钟速读仅需 2 分钟大家好,我是你们的校长。我知道大家在家里都憋坏了,大家可能相对于封闭在家里“坐月子”,更希望能够早日上班。今天我带着大家换个思路来聊一个问题...
用前端5分钟写一个在线m3u8在线播放器
&lt;!DOCTYPE html&gt; &lt;html lang="en"&gt; &lt;head&gt; &lt;meta charset="UTF-8"&gt; &lt;meta name="viewport" content="width=device-width, initial-scale=1.0"&gt; &lt;meta http-equiv="X...
Spring框架|JdbcTemplate介绍
文章目录一、JdbcTemplate 概述二、创建对象的源码分析三、JdbcTemplate操作数据库 一、JdbcTemplate 概述 在之前的web学习中,学习了手动封装JDBCtemplate,其好处是通过(sql语句+参数)模板化了编程。而真正的JDBCtemplete类,是Spring框架为我们写好的。 它是 Spring 框架中提供的一个对象,是对原始 Jdbc API 对象的简单...
谁说程序员不懂浪漫——我的C语言结婚请柬(附源码)
前言:但行好事,莫问前程——《增广贤文》 从上学起开始学C++,后面也做过H5,现在做Android。无论是学习用的,还是工作用的,上百个软件不止。但最另我骄傲的是,我用程序烂漫了一把。 用C++语言,利用WIN32框架写一个结婚请柬,文末附源码和使用方法,大家可以自行修改,记得帮我点赞哦。 点开程序,你的电脑像中毒一般,漫天的樱花从屏幕上方,伴随着歌声《今天你要嫁给我》,缓缓落下。 ...
2020年2月中国编程语言排行榜
编程语言比例 排名 编程语言 最低工资 工资中位数 最低工资 最高工资 人头 人头百分比 1 rust 21433 20000 5266 45000 369 0.11% 2 typescript 18727 22500 6500 30000 1841 0.57% 3 go 18292 16000 6175 40000 23860 7.35% 4 lua 18219 1...
为什么说程序员做外包没前途?
之前做过不到3个月的外包,2020的第一天就被释放了,2019年还剩1天,我从外包公司离职了。我就谈谈我个人的看法吧。首先我们定义一下什么是有前途 稳定的工作环境 不错的收入 能够在项目中不断提升自己的技能(ps:非技术上的认知也算) 找下家的时候能找到一份工资更高的工作 如果你目前还年轻,但高不成低不就,只有外包offer,那请往下看。 外包公司你应该...
B 站上有哪些很好的学习资源?
哇说起B站,在小九眼里就是宝藏般的存在,放年假宅在家时一天刷6、7个小时不在话下,更别提今年的跨年晚会,我简直是跪着看完的!! 最早大家聚在在B站是为了追番,再后来我在上面刷欧美新歌和漂亮小姐姐的舞蹈视频,最近两年我和周围的朋友们已经把B站当作学习教室了,而且学习成本还免费,真是个励志的好平台ヽ(.◕ฺˇд ˇ◕ฺ;)ノ 下面我们就来盘点一下B站上优质的学习资源: 综合类 Oeasy: 综合...
立即提问