70

帖子

0

TA的资源

一粒金砂(初级)

21
 
其实看出很多问题,因为没空去验证,说不清楚,不过可以肯定,从设计思想上看,这个程序很难运行很久,如果能运行很久,那是运气。不过前面几个家伙提到的HDC只能有一个线程在同一时间操作,我是同意的,自从windows 95以来,这个就是禁忌,几年前看到梁肇新的书《编程高手箴言》也提到,超级解霸解决了那么多死锁问题,这个也是考虑之一。

回复

73

帖子

0

TA的资源

一粒金砂(初级)

22
 
TO:nbcool
哦.知道了.
TO 大家:
另外通过前面各位高手的指导,我把我程序总体结构改了下,下面是主体代码,大家看看这会问题多不?还有个问题就是,我发现我程序死掉可能不是我程序的事.我这边把开发板打开 过了一个晚上,今天一看 也死掉了.现在我正研究是我内核定制的事,还是 硬件问题.不过还是请大家帮我看看下面程序的结构,以前感觉我这程序没什么问题了。 可是通过这个帖子,我发现我还有很多不足,希望各位能帮我多找点问题,我会努力改进的

  1. DWORD WINAPI Thread_ReadPlayList(LPVOID lpParam)
  2. {
  3.         HANDLE        hFileHandle;
  4.         int nWidth,nHeight;
  5.         BOOL        bRes;
  6.         DWORD        dwReadByte;
  7.         int nTemp,nUsedLabelItem;

  8.         hFileHandle=CreateFile(PlayListPath,GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_READONLY,NULL);
  9.         if(INVALID_HANDLE_VALUE==hFileHandle)
  10.         {MessageErrorBox(GetLastError(),L"Faile Open File");}
  11.        
  12.         bRes=ReadFile(hFileHandle,&nWidth,sizeof(int),&dwReadByte,NULL);
  13.         if(FALSE==bRes)
  14.         {MessageErrorBox(GetLastError(),L"Read File");}
  15.         bRes=ReadFile(hFileHandle,&nHeight,sizeof(int),&dwReadByte,NULL);
  16.         if(FALSE==bRes)
  17.         {MessageErrorBox(GetLastError(),L"Read File");}

  18.         if(nWidth!=g_nScreenWidth||nHeight!=g_nScreenHeight)
  19.         {
  20.                 //传送错误信息:节目列表错误,不是当前屏幕的节目列表
  21.                 MessageBoxW(NULL,L"传输的节目列表文件错误",L"Error",MB_OK);
  22.                 return 1;
  23.         }
  24.         while(!g_bStop)
  25.         {
  26.                 bRes=ReadFile(hFileHandle,&nTemp,sizeof(int),&dwReadByte,NULL);
  27.                 if(FALSE==bRes)
  28.                         {MessageErrorBox(GetLastError(),L"Read File");}
  29.                
  30.                 if(0==dwReadByte)//文件结束
  31.                 {
  32.                         bRes=CloseHandle(hFileHandle);
  33.                         if(FALSE==bRes)
  34.                                 MessageErrorBox(GetLastError(),L"CloseFile");
  35.                         {//-----------
  36.                                 hFileHandle=CreateFile(PlayListPath,GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_READONLY,NULL);
  37.                                 if(INVALID_HANDLE_VALUE==hFileHandle)
  38.                                 {MessageErrorBox(GetLastError(),L"Faile Open File");}
  39.        
  40.                                 bRes=ReadFile(hFileHandle,&nWidth,sizeof(int),&dwReadByte,NULL);
  41.                                 if(FALSE==bRes)
  42.                                 {MessageErrorBox(GetLastError(),L"Read File");}
  43.                                 bRes=ReadFile(hFileHandle,&nHeight,sizeof(int),&dwReadByte,NULL);
  44.                                 if(FALSE==bRes)
  45.                                 {MessageErrorBox(GetLastError(),L"Read File");}
  46.                         }//-----------

  47.                 }
  48.                 switch(nTemp)
  49.                 {
  50.                 case CLOCK_Type:
  51.                         Thread_Switch_Clock_Type(hFileHandle);               
  52.                         continue;
  53.                         break;
  54.                 case PIC_Type:
  55.                         Thread_Switch_Pic_Type(hFileHandle);
  56.                         break;
  57.                 case LABEL_Type:
  58.                         Thread_Switch_Label_Type(hFileHandle,nUsedLabelItem);
  59.                         continue;
  60.                         break;
  61.                 case NEWNODE:
  62.                         Thread_Switch_NewNode(nUsedLabelItem);               
  63.                 case ENDNODE:
  64.                         continue;
  65.                         break;
  66.                 }
  67.         }//}}}
  68.         //检查未释放资源,进行释放
  69.         return 1;

  70. void MessageErrorBox(int nError,CString strError)
  71. {
  72.         CString str;
  73.         str.Format(L"%d",nError);
  74.         MessageBoxW(NULL,str,strError,MB_OK);
  75. }
  76. void Thread_Switch_Clock_Type(HANDLE hFileHandle)
  77. {
  78.         BOOL bRes;
  79.         DWORD dwReadByte;
  80.         g_pClockNode=(Arm_Clock_SetInfo *)malloc(sizeof(Arm_Clock_SetInfo));
  81.         if(g_pClockNode==NULL)
  82.                 MessageErrorBox(-1,L"Malloc");
  83.         bRes=ReadFile(hFileHandle,g_pClockNode,sizeof(Arm_Clock_SetInfo),&dwReadByte,NULL);
  84.         if(FALSE==bRes)
  85.                 {MessageErrorBox(GetLastError(),L"Read File");}
  86.         hClockFont=CreateFontIndirect(&g_pClockNode->logFont);
  87. }
  88. void Thread_Switch_Pic_Type(HANDLE hFileHandle)
  89. {
  90.         BOOL bRes;
  91.         DWORD        dwReadByte;
  92.         g_PlayNode.nType=PIC_Type;
  93.         if(g_PlayNode.pPointer)
  94.                 free(g_PlayNode.pPointer);
  95.         g_PlayNode.pPointer=malloc(sizeof(Arm_Pic_SetInfo));
  96.                 if(g_PlayNode.pPointer==NULL)
  97.                                 MessageErrorBox(-1,L"Malloc");
  98.         bRes=ReadFile(hFileHandle,g_PlayNode.pPointer,sizeof(Arm_Pic_SetInfo),&dwReadByte,NULL);
  99.         if(FALSE==bRes)
  100.                 {MessageErrorBox(GetLastError(),L"Read File");}
  101.         g_PlayNode.PathName=
  102.                 (TCHAR *)malloc(((Arm_Pic_SetInfo *)g_PlayNode.pPointer)->nPathLength*sizeof(TCHAR));
  103.         if(g_PlayNode.PathName==NULL)
  104.                 MessageErrorBox(-1,L"Malloc");
  105.         bRes=ReadFile(hFileHandle,g_PlayNode.PathName,sizeof(TCHAR)*((Arm_Pic_SetInfo *)g_PlayNode.pPointer)->nPathLength,
  106.                 &dwReadByte,NULL);
  107.         if(FALSE==bRes)
  108.                 {MessageErrorBox(GetLastError(),L"Read File");}
  109.         PlayPic();
  110. }
  111. void Thread_Switch_Label_Type(HANDLE hFileHandle,int &nUsedLabelItem)
  112. {
  113.         Arm_Label_Node *pLabel;
  114.         BOOL        bRes;
  115.         DWORD        dwReadByte;
  116.         if(NULL==g_pLabelNode)
  117.         {
  118.                 g_pLabelNode=(Arm_Label_Node *)malloc(sizeof(Arm_Label_Node));
  119.                 if(g_pLabelNode==NULL)
  120.                         MessageErrorBox(-1,L"Malloc");
  121.                         pLabel=g_pLabelNode;
  122.                 }else
  123.                 {
  124.                         pLabel=g_pLabelNode;
  125.                         while(NULL!=pLabel->next)
  126.                                 pLabel=pLabel->next;
  127.                         pLabel->next=(Arm_Label_Node *)malloc(sizeof(Arm_Label_Node));
  128.                         if(g_pLabelNode->next==NULL)
  129.                                 MessageErrorBox(-1,L"Malloc");
  130.                         pLabel=pLabel->next;
  131.                 }
  132.         pLabel->next=NULL;
  133.         pLabel->pArm_Label_SetInfo=(Arm_Label_SetInfo *)
  134.                 malloc(sizeof(Arm_Label_SetInfo));
  135.         if(pLabel->pArm_Label_SetInfo==NULL)
  136.                 MessageErrorBox(-1,L"Malloc");
  137.         bRes=ReadFile(hFileHandle,pLabel->pArm_Label_SetInfo,sizeof(Arm_Label_SetInfo),&dwReadByte,NULL);
  138.         if(FALSE==bRes)
  139.                 {MessageErrorBox(GetLastError(),L"Read File");}
  140.         bRes=ReadFile(hFileHandle,pLabel->tContent,sizeof(TCHAR)*pLabel->pArm_Label_SetInfo->nContentLength,&dwReadByte,NULL);
  141.         if(FALSE==bRes)
  142.                 {MessageErrorBox(GetLastError(),L"Read File");}
  143.         hLabelFont[nUsedLabelItem++]=CreateFontIndirect(&pLabel->pArm_Label_SetInfo->logFont);
  144. }
  145. void Thread_Switch_NewNode(int &nUsedLabelItem)
  146. {
  147.         BOOL bRes;
  148.         Arm_Label_Node *pLabel;
  149.         nUsedLabelItem=0;
  150.         for(int i=0;i
  151.         {
  152.         if(NULL!=hLabelFont[i])
  153.         {
  154.                 bRes=DeleteObject(hLabelFont[i]);
  155.                 hLabelFont[i]=NULL;
  156.                 if(FALSE==bRes)
  157.                         MessageErrorBox(GetLastError(),L"DeleteObject");
  158.         }
  159.         }
  160.         if(NULL!=hClockFont)
  161.         {
  162.                 bRes=DeleteObject(hClockFont);
  163.                 hClockFont=NULL;
  164.                 if(FALSE==bRes)
  165.                         MessageErrorBox(GetLastError(),L"DeleteObject");
  166.         }
  167.         while(NULL!=g_pLabelNode)
  168.         {
  169.                 pLabel=g_pLabelNode->next;
  170.                 free(g_pLabelNode->pArm_Label_SetInfo);
  171.                 free(g_pLabelNode);
  172.                 g_pLabelNode=pLabel;
  173.         }
  174.         if(NULL!=g_pClockNode)
  175.                 free(g_pClockNode);
  176.                 g_pClockNode=NULL;
  177.                 g_pLabelNode=NULL;
  178. }
  179. void PlayPic()
  180. {
  181.         CIImage mage;
  182.         CString strPath;
  183.         strPath=PicPathExtent;
  184.         strPath+=g_PlayNode.PathName;

  185.         mage.Draw(g_hIImageDC,0,0,g_nScreenWidth,g_nScreenHeight,strPath);
  186.         int i=0;
  187.         while(1)
  188.         {
  189.                 BitBlt(g_hMiddleDC,0,0,i,g_nScreenHeight,g_hIImageDC,g_nScreenWidth-i,0,SRCCOPY);

  190.                 SendMessage(g_hWnd,MSG_COPYSCREEN,0,0[color=#FF0000]);//这里用SendMessage,不用
  191.                                                                 //PostMessage,来解决
  192.                                                                //一个时刻只有一个地方对HDC进行操作.(个人认
  193.                                                              //为可以,如果有不妥请指出)[/color]
  194.                 Sleep(5);
  195.                 i++;
  196.                 if(i>=g_nScreenWidth)
  197.                         break;
  198.         }
  199. }
  200. LRESULT CLED_PlayerDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
  201. {
  202.         // TODO: Add your specialized code here and/or call the base class
  203.         switch(message)
  204.         {
  205.         case MSG_COPYSCREEN:
  206.                 msg_CopyScreen();
  207.                 break;
  208.         }
  209.         return CDialog::WindowProc(message, wParam, lParam);
  210. }

  211. void CLED_PlayerDlg::msg_CopyScreen()
  212. {
  213.         Arm_Label_Node *pLabel;
  214.         HDC hdc=::GetDC(this->m_hWnd);[color=#FF0000]//注意:这里我是用API函数做的, 如果我用MFC 做
  215.                                            //CDC *dc=this->GetDC();dc->BitBlt(...);ReleaseDC(dc);
  216.                                       //的话 会有内存泄露不知道为什么,请指教[/color]
  217.         BitBlt(g_hTopDC,0,0,g_nScreenWidth,g_nScreenHeight,g_hMiddleDC,0,0,SRCCOPY);
  218.         pLabel=g_pLabelNode;
  219.         int nItem=0;
  220.         while(NULL!=pLabel)
  221.         {
  222.                 DrawLabel(pLabel,nItem++);                       
  223.                 pLabel=pLabel->next;
  224.         }
  225.         if(NULL!=g_pClockNode)
  226.                 DrawClock(g_pClockNode);
  227.         BitBlt(hdc,0,0,g_nScreenWidth,g_nScreenHeight,g_hTopDC,0,0,SRCCOPY);
  228.         ::ReleaseDC(this->m_hWnd,hdc);
  229.        
  230. }
复制代码


程序可以说是顺序执行的了.....但我以后还要添加别的消息响应,所以还是把读文件放到了一个单独的线程里面.
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表