经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 软件图像 » Visual Studio » 查看文章
Windows核心编程:第10章 同步设备IO与异步设备IO
来源:cnblogs  作者:gongluck  时间:2018/9/25 20:49:24  对本文有异议

Github

https://github.com/gongluck/Windows-Core-Program.git

  1. //第10章 同步设备IO与异步设备IO.cpp: 定义应用程序的入口点。
  2. //
  3. #include "stdafx.h"
  4. #include "第10章 同步设备IO与异步设备IO.h"
  5. //可提醒IO回调
  6. VOID WINAPI funComplete(
  7. _In_ DWORD dwErrorCode,
  8. _In_ DWORD dwNumberOfBytesTransfered,
  9. _Inout_ LPOVERLAPPED lpOverlapped
  10. )
  11. {
  12. }
  13. //IO完成端口工作线程
  14. DWORD WINAPI workthread(LPVOID lpThreadParameter)
  15. {
  16. DWORD NumberOfBytesTransferred;
  17. DWORD CompletionKey;
  18. OVERLAPPED* pOverlapped;
  19. BOOL bres = GetQueuedCompletionStatus(lpThreadParameter, &NumberOfBytesTransferred, &CompletionKey, &pOverlapped, INFINITE);
  20. //GetQueuedCompletionStatusEx可获取多个IO请求结果
  21. DWORD dres = GetLastError();
  22. return 0;
  23. }
  24. int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
  25. _In_opt_ HINSTANCE hPrevInstance,
  26. _In_ LPWSTR lpCmdLine,
  27. _In_ int nCmdShow)
  28. {
  29. //打开(创建)文件
  30. HANDLE hFile = CreateFile(TEXT("第10章 同步设备IO与异步设备IO.cpp"), GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ, nullptr, OPEN_EXISTING, 0, nullptr);
  31. if (hFile == INVALID_HANDLE_VALUE)
  32. {
  33. MessageBox(nullptr, TEXT("打开文件失败!"), TEXT("error"), MB_OK);
  34. return 0;
  35. }
  36. //文件类型
  37. DWORD dres = GetFileType(hFile);
  38. //dres == FILE_TYPE_DISK
  39. //文件大小
  40. LARGE_INTEGER li;
  41. BOOL bres = GetFileSizeEx(hFile, &li);//逻辑大小
  42. li.LowPart = GetCompressedFileSize(TEXT("第10章 同步设备IO与异步设备IO.cpp"), (DWORD*)&li.HighPart);//物理大小
  43. //文件指针
  44. li.QuadPart = 0;
  45. bres = SetFilePointerEx(hFile, li, nullptr, FILE_END);
  46. bres = SetFilePointerEx(hFile, li, &li, FILE_CURRENT);
  47. bres = SetEndOfFile(hFile);
  48. li.QuadPart = 0;
  49. bres = SetFilePointerEx(hFile, li, nullptr, FILE_BEGIN);
  50. //同步IO
  51. char* buf = new char[100];
  52. bres = ReadFile(hFile, buf, 100, &dres, nullptr);
  53. delete []buf;
  54. buf = nullptr;
  55. //刷新缓冲区
  56. bres = FlushFileBuffers(hFile);
  57. //CancelSynchronousIo
  58. //取消线程未完成的同步IO请求
  59. //关闭文件
  60. CloseHandle(hFile);
  61. hFile = nullptr;
  62. //异步IO
  63. HANDLE hFile2 = CreateFile(TEXT("第10章 同步设备IO与异步设备IO.cpp"), GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, nullptr, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, nullptr);
  64. OVERLAPPED ol;
  65. ol.Offset = 1024;
  66. ol.OffsetHigh = 0;
  67. ol.hEvent = CreateEvent(nullptr, FALSE, FALSE, nullptr);
  68. char* buf2 = new char[1024];
  69. bres = ReadFile(hFile2, buf2, 1024, nullptr, &ol);//异步方式总是返回FALSE
  70. dres = GetLastError();
  71. switch (dres)
  72. {
  73. case ERROR_IO_PENDING:
  74. //IO请求添加成功
  75. //WaitForSingleObject(hFile2, INFINITE);
  76. WaitForSingleObject(ol.hEvent, INFINITE);
  77. break;
  78. case ERROR_INVALID_USER_BUFFER:
  79. case ERROR_NOT_ENOUGH_MEMORY:
  80. break;
  81. case ERROR_NOT_ENOUGH_QUOTA:
  82. break;
  83. default:
  84. break;
  85. }
  86. //取消队列中的IO请求
  87. //bres = CancelIo(hFile2);
  88. bres = CancelIoEx(hFile2, &ol);
  89. //bres = CancelIoEx(hFile2, nullptr);
  90. //bres = CloseHandle(hFile2);
  91. if (ol.hEvent != nullptr)
  92. {
  93. CloseHandle(ol.hEvent);
  94. ol.hEvent = nullptr;
  95. }
  96. //可提醒IO
  97. OVERLAPPED ol2;
  98. ol2.Offset = 1024;
  99. ol2.OffsetHigh = 0;
  100. ol2.hEvent = nullptr;
  101. dres = ReadFileEx(hFile2, buf2, 1024, &ol2, funComplete);//回调函数在同一个线程空间
  102. //置为可提醒状态
  103. //APC队列中只要有一个,线程就不会进入睡眠
  104. dres = SleepEx(INFINITE, TRUE);
  105. //WaitForSingleObjectEx
  106. //WaitForMultipleObjectsEx
  107. //SignalObjectAndWait
  108. //GetQueuedCompletionStatusEx
  109. //MsgWaitForMultipleObjectsEx
  110. dres = GetLastError();//WAIT_IO_COMPLETION
  111. //手动添加一项到APC队列
  112. //可以让目标线程结束睡眠
  113. dres = QueueUserAPC((PAPCFUNC)funComplete, GetCurrentThread(), NULL);
  114. //IO完成端口
  115. HANDLE iocp = CreateIoCompletionPort(hFile2, nullptr, 1, 2);
  116. HANDLE hts[2];
  117. for (int i = 0; i < 2; ++i)
  118. hts[i] = CreateThread(nullptr, 0, workthread, iocp, 0, nullptr);
  119. bres = PostQueuedCompletionStatus(iocp, 100, 1, &ol); //模拟发送IO请求完成
  120. bres = ReadFile(hFile2, buf2, 1024, nullptr, &ol2);
  121. dres = GetLastError();
  122. WaitForMultipleObjects(2, hts, TRUE, INFINITE);
  123. for (int i = 0; i < 2; ++i)
  124. {
  125. CloseHandle(hts[i]);
  126. hts[i] = nullptr;
  127. }
  128. CloseHandle(iocp);
  129. iocp = nullptr;
  130. CloseHandle(hFile2);
  131. hFile2 = nullptr;
  132. delete[]buf2;
  133. buf2 = nullptr;
  134. system("pause");
  135. return 0;
  136. }
 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号