{"id":1308,"date":"2019-07-04T19:26:48","date_gmt":"2019-07-04T10:26:48","guid":{"rendered":"https:\/\/www.oji-koji.com\/?p=1308"},"modified":"2021-07-28T10:35:01","modified_gmt":"2021-07-28T01:35:01","slug":"%e3%83%9e%e3%83%ab%e3%83%81%e3%82%b9%e3%83%ac%e3%83%83%e3%83%89%e3%83%97%e3%83%ad%e3%82%b0%e3%83%a9%e3%83%a0-%e6%8e%92%e4%bb%96%e5%87%a6%e7%90%86%ef%bc%88%e5%90%8c%e6%9c%9f%e5%87%a6%e7%90%86%ef%bc%89","status":"publish","type":"post","link":"https:\/\/www.oji-koji.com\/?p=1308","title":{"rendered":"\u30de\u30eb\u30c1\u30b9\u30ec\u30c3\u30c9\u30d7\u30ed\u30b0\u30e9\u30e0 \u6392\u4ed6\u51e6\u7406\uff08\u540c\u671f\u51e6\u7406\uff09\u306e\u305f\u3081\u306e\u30af\u30e9\u30b9"},"content":{"rendered":"\n<p class=\"program_discription\"><a rel=\"noreferrer noopener\" aria-label=\"\u30de\u30eb\u30c1\u30b9\u30ec\u30c3\u30c9\u3092\u5b9f\u73fe\u3059\u308b\u57fa\u672c\u30af\u30e9\u30b9 (\u65b0\u3057\u3044\u30bf\u30d6\u3067\u958b\u304f)\" href=\"https:\/\/www.oji-koji.com\/?p=1152\" target=\"_blank\">\u30de\u30eb\u30c1\u30b9\u30ec\u30c3\u30c9\u3092\u5b9f\u73fe\u3059\u308b\u57fa\u672c\u30af\u30e9\u30b9<\/a>\u306b\u3088\u3063\u3066\u3001Linux, Windows\u306e\u30d7\u30ed\u30b0\u30e9\u30e0\u3092<br>\u304b\u306a\u308a\u5171\u901a\u5316\u3067\u304d\u307e\u3057\u305f\u3002<br>\u3057\u304b\u3057\u3001<a href=\"https:\/\/www.oji-koji.com\/?p=1205\" target=\"_blank\" rel=\"noreferrer noopener\" aria-label=\"\u540c\u671f\u51e6\u7406\u3092\u8ffd\u52a0 (\u65b0\u3057\u3044\u30bf\u30d6\u3067\u958b\u304f)\">\u540c\u671f\u51e6\u7406\u3092\u8ffd\u52a0<\/a>\u3057\u305f\u3053\u3068\u3067\u3001\u305d\u306e\u90e8\u5206\u306e\u5171\u901a\u5316\u304c\u5d29\u308c\u3066\u3057\u307e\u3044\u307e\u3057\u305f\u3002<br>\u3053\u3053\u3067\u306f\u3001\u540c\u671f\u51e6\u7406\u306e\u305f\u3081\u306e\u30af\u30e9\u30b9\u3092\u4f5c\u6210\u3059\u308b\u3053\u3068\u3067\u3001\u518d\u3073\u5171\u901a\u5316\u3092\u56f3\u308a\u3001<br>\u3053\u308c\u3089\u3092\u4f7f\u7528\u3057\u3066\u3001\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u30d7\u30ed\u30b0\u30e9\u30e0\u3092\u30de\u30eb\u30c1\u30b9\u30ec\u30c3\u30c9\u5316\u3059\u308b\u3053\u3068\u306b\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<p class=\"program_discription\">\u6b21\u306e\u3088\u3046\u306a\u30af\u30e9\u30b9\u3092\u4f5c\u6210\u3057\u307e\u3059\u3002<br>  \u30af\u30e9\u30b9\u540d\uff1aCMySyncObject<br>  \u30d5\u30a1\u30a4\u30eb\u540d\uff1aMySyncObject.cpp\u3001MySyncObject.h<br>Windows\u7248\u3067\u306f\u30af\u30ea\u30c6\u30a3\u30ab\u30eb\u30bb\u30af\u30b7\u30e7\u30f3\u3092\u4f7f\u7528\u3057\u3066\u307f\u307e\u3059\u3002<br>  PrintMACCriticalSection\u3092\u53c2\u8003\u306b\u3057\u3066PrintMACSync\u3092\u4f5c\u6210\u3057\u3066\u307e\u3059<br>Linux\u7248\u3067\u306f\u30df\u30e5\u30fc\u30c6\u30c3\u30af\u30b9\u3092\u4f7f\u7528\u3057\u3066\u307f\u307e\u3059\u3002<br>  PrintMACMutex\u3092\u53c2\u8003\u306b\u3057\u3066PrintMACSync\u3092\u4f5c\u6210\u3057\u307e\u3059<\/p>\n\n\n\n<p class=\"source_code\">\u3010CMySyncObject\u3011\n\u30d1\u30d6\u30ea\u30c3\u30af\u30e1\u30bd\u30c3\u30c9\n    BOOL    Initialize();          \/\/ \u521d\u671f\u5316\n    BOOL    Uninitialize();        \/\/ \u958b\u653e\n    BOOL    Lock();                \/\/ \u30ed\u30c3\u30af(\u6240\u6709\u6a29\u53d6\u5f97\u5f85\u3061)\n    BOOL    UnLock();              \/\/ \u30a2\u30f3\u30ed\u30c3\u30af(\u6240\u6709\u6a29\u958b\u653e)<\/p>\n\n\n\n<p class=\"program_discription\"><strong>\u30de\u30eb\u30c1\u30b9\u30ec\u30c3\u30c9\u30d7\u30ed\u30b0\u30e9\u30e0 \u6392\u4ed6\u51e6\u7406\uff08\u540c\u671f\u5236\u5fa1\uff09\u306e\u30af\u30e9\u30b9\u5bfe\u5fdcWindows\u7248<\/strong><br>  \u524d\u56de\u4f5c\u6210\u3057\u305f\u30d7\u30ed\u30b8\u30a7\u30af\u30c8(<a href=\"https:\/\/www.oji-koji.com\/?p=1205\" target=\"_blank\" rel=\"noreferrer noopener\" aria-label=\"PrintMACCriticalSection (\u65b0\u3057\u3044\u30bf\u30d6\u3067\u958b\u304f)\">PrintMACCriticalSection<\/a>)\u3092\u30b3\u30d4\u30fc\u3057\u3001\u30d5\u30a9\u30eb\u30c0\u540d\u3001<br>  \u30bd\u30ea\u30e5\u30fc\u30b7\u30e7\u30f3\u540d\u3001\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u540d\u3092PrintMACSync\u306b\u5909\u66f4\u3057\u307e\u3059\u3002<br>  \u65b0\u898f\u8ffd\u52a0\u3067\u3001C++\u306e\u30af\u30e9\u30b9CMySyncObject\u3092\u8ffd\u52a0\u3057\u307e\u3059\u3002<br>    \u30d5\u30a1\u30a4\u30eb\u540d\uff1aMySyncObject.cpp\u3001MySyncObject.h<\/p>\n\n\n\n<figure class=\"wp-block-image is-resized\"><a href=\"https:\/\/www.oji-koji.com\/wp-content\/uploads\/2019\/07\/PrintMACSyncWin.png\" data-rel=\"lightbox-gallery-BwvbW0LT\" data-rl_title=\"\" data-rl_caption=\"\" title=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.oji-koji.com\/wp-content\/uploads\/2019\/07\/PrintMACSyncWin-1024x426.png\" alt=\"\" class=\"wp-image-1315\" width=\"768\" height=\"320\" srcset=\"https:\/\/www.oji-koji.com\/wp-content\/uploads\/2019\/07\/PrintMACSyncWin-1024x426.png 1024w, https:\/\/www.oji-koji.com\/wp-content\/uploads\/2019\/07\/PrintMACSyncWin-300x125.png 300w, https:\/\/www.oji-koji.com\/wp-content\/uploads\/2019\/07\/PrintMACSyncWin-768x319.png 768w\" sizes=\"auto, (max-width: 768px) 100vw, 768px\" \/><\/a><\/figure>\n\n\n\n<p class=\"program_discription\">public\u3067\u516c\u958b\u3055\u308c\u308b\u30e1\u30bd\u30c3\u30c9\u306f\u3001WIndows\u3068Linux\u9593\u3067\u5171\u901a\u306b\u3057\u307e\u3059\u3002<br>private\u3067\u3001\u30af\u30ea\u30c6\u30a3\u30ab\u30eb\u30bb\u30af\u30b7\u30e7\u30f3\u3092\u5b9a\u7fa9\u3057\u3066\u3044\u307e\u3059\u3002<br>\u3082\u3061\u308d\u3093\u30df\u30e5\u30fc\u30c6\u30c3\u30af\u30b9(\u30cf\u30f3\u30c9\u30eb)\u3092\u4f7f\u3063\u3066\u4f5c\u6210\u3059\u3044\u308b\u3053\u3068\u3082\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<p class=\"source_code\">\u3010MySyncObject.h\u3011\n#pragma once\n#include &#8220;stdThread.h&#8221;\n\nclass CMySyncObject\n{\npublic:\n    CMySyncObject();\n    ~CMySyncObject();\n\n    BOOL    Initialize();        \/\/ \u521d\u671f\u5316\n    BOOL    Uninitialize();      \/\/ \u958b\u653e\n    BOOL    Lock();              \/\/ \u30ed\u30c3\u30af(\u6240\u6709\u6a29\u53d6\u5f97\u5f85\u3061)\n    BOOL    UnLock();            \/\/ \u30a2\u30f3\u30ed\u30c3\u30af(\u6240\u6709\u6a29\u958b\u653e)\n\nprivate:\n    CRITICAL_SECTION m_cs;       \/\/ \u30af\u30ea\u30c6\u30a3\u30ab\u30eb\u30bb\u30af\u30b7\u30e7\u30f3\u3092\u4f7f\u3044\u307e\u3059\n};<\/p>\n\n\n\n<p class=\"program_discription\">MySyncObject.cpp\u306b\u3064\u3044\u3066\u306f\u3001PrintMACCriticalSection\u3067\u4f5c\u6210\u3057\u305f\u5185\u5bb9\u3068<br>\u540c\u3058\u306a\u306e\u3067\u3001\u5927\u4e08\u592b\u3067\u3057\u3087\u3046\u3002<br>Unlock()\u306b\u5ff5\u306e\u305f\u3081Sleep(0)\u3092\u30b3\u30e1\u30f3\u30c8\u3067\u8a18\u8ff0\u3057\u3066\u3044\u307e\u3059\u3002<br>\u4ed6\u306e\u30b9\u30ec\u30c3\u30c9\u304c\u5b9f\u884c\u3055\u308c\u306a\u3044\u3068\u304d\u306f\u30e1\u30f3\u30c8\u3092\u5916\u3057\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n\n\n\n<p class=\"source_code\">\u3010MySyncObject.cpp\u3011\n#include &#8220;MySyncObject.h&#8221;\n\nCMySyncObject::CMySyncObject()\n{\n}\n\n\nCMySyncObject::~CMySyncObject()\n{\n}\n\nBOOL CMySyncObject::Initialize()\n{\n    InitializeCriticalSection(&amp;m_cs);  \/\/ \u30af\u30ea\u30c6\u30a3\u30ab\u30eb\u30bb\u30af\u30b7\u30e7\u30f3\u306e\u521d\u671f\u5316\n    return(TRUE);\n}\n\nBOOL CMySyncObject::Uninitialize()\n{\n    DeleteCriticalSection(&amp;m_cs);      \/\/ \u30af\u30ea\u30c6\u30a3\u30ab\u30eb\u30bb\u30af\u30b7\u30e7\u30f3\u306e\u958b\u653e\n    return(TRUE);\n}\n\nBOOL CMySyncObject::Lock()                 \/\/ \u6240\u6709\u6a29\u3092\u53d6\u5f97\u3059\u308b\u307e\u3067\u5f85\u3064\n{\n    EnterCriticalSection(&amp;m_cs);\n    return(TRUE);\n}\n\nBOOL CMySyncObject::UnLock()               \/\/ \u6240\u6709\u6a29\u3092\u958b\u653e\u3059\u308b\n{\n    LeaveCriticalSection(&amp;m_cs);\n\/\/  Sleep(0);                              \/\/ \u4ed6\u306e\u30b9\u30ec\u30c3\u30c9\u306b\u5b9f\u884c\u306e\u30c1\u30e3\u30f3\u30b9\u3092\u4e0e\u3048\u308b\n    return(TRUE);\n}<\/p>\n\n\n\n<p class=\"program_discription\">CMyThread\u306e\u540c\u671f\u51e6\u7406\u306e\u90e8\u5206\u3092CMySyncObject\u306b\u7f6e\u304d\u63db\u3048\u307e\u3059\u3002<br>\u7f6e\u304d\u63db\u3048\u305f\u500b\u6240\u306b\u306f\u2605\u3092\u66f8\u3044\u3066\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<p class=\"source_code\">\u3010MyThread.h\u3011\n#pragma once\n#include &#8220;ThreadJob.h&#8221;\n\nclass CMySyncObject;                \/\/ \u2605\u3053\u306e\u30af\u30e9\u30b9\u306e\u4f7f\u7528\u3059\u308b\u3053\u3068\u3092\u5ba3\u8a00\n\n\/\/ \u5fc5\u8981\u306a\u30d1\u30e9\u30e1\u30fc\u30bf\u3092\u69cb\u9020\u4f53\u306b\u3059\u308b\ntypedef struct\n{\n    char    cData;                      \/\/ \u8868\u793a\u3059\u308b\u6587\u5b57\n    DWORD   dwTimer;                    \/\/ \u8868\u793a\u9593\u9694(msec)\n    DWORD   dwCharacterInterval;        \/\/ \u6587\u5b57\u9593(msec)\n    int     iNum;                       \/\/ \u8868\u793a\u3059\u308b\u500b\u6570\n    CMySyncObject  *pCMySyncObject;     \/\/ \u2605\u540c\u671f\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\n} MyDataRec;\n\nclass CMyThread : public CThreadJob\n{\npublic:\n    CMyThread(MyDataRec *pData);        \/\/ \u30d1\u30e9\u30e1\u30fc\u30bf\u3092\u30b3\u30f3\u30b9\u30c8\u30e9\u30af\u30bf\u3067\u6e21\u3059\n    ~CMyThread();\n    \/\/ \u57fa\u5e95\u30af\u30e9\u30b9\u306e\u95a2\u6570\u3092\u30aa\u30fc\u30d0\u30fc\u30e9\u30a4\u30c9\u3059\u308b\n    \/\/ C++11\u3067\u660e\u793a\u7684\u306boverride\u3092\u66f8\u304f\u3053\u3068\u304c\u51fa\u6765\u308b\u3088\u3046\u306b\u306a\u308a\u307e\u3057\u305f\n    \/\/ \u57fa\u5e95\u30af\u30e9\u30b9\u306e\u5f53\u8a72\u95a2\u6570\u306bvirtual\u304c\u66f8\u3044\u3066\u3044\u306a\u3044\u3068\u30a8\u30e9\u30fc\u3092\u51fa\u3057\u3066\u304f\u308c\u307e\u3059\n    UINT DoWork() override;             \/\/ cData\u3092dwTime(msec)\u9593\u9694\u3067\u8868\u793a\u3059\u308b\nprivate:\n    MyDataRec    *m_pMyData;            \/\/ \u30b3\u30f3\u30b9\u30c8\u30e9\u30af\u30bf\u3067\u6e21\u3055\u308c\u308b\u30d1\u30e9\u30e1\u30fc\u30bf\u3092\u683c\u7d0d\n                                        \/\/ \u3053\u306e\u30b9\u30ec\u30c3\u30c9\u5b9f\u884c\u4e2d\u9818\u57df\u304c\u78ba\u4fdd\u3055\u308c\u3066\u3044\u308b\u3053\u3068\n};<\/p>\n\n\n\n<p class=\"program_discription\"><\/p>\n\n\n\n<p class=\"source_code\">\u3010MyThread.cpp\u3011\n#include &#8220;MyThread.h&#8221;\n#include &#8220;MySyncObject.h&#8221;      \/\/ \u2605CMySyncObject\u3092\u4f7f\u3046\u305f\u3081\n\n\/\/&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-\n\/\/ function\n\/\/    \u30b3\u30f3\u30b9\u30c8\u30e9\u30af\u30bf\n\/\/ parameter\n\/\/    MyDataRec *pData    [in]\u6a5f\u80fd\u306b\u5fc5\u8981\u306a\u60c5\u5831\n\/\/ return\n\/\/    \u306a\u3057\n\/\/&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-\nCMyThread::CMyThread(MyDataRec *pData)\n{\n    m_pMyData = pData;\n}\n\n\/\/&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-\n\/\/ function\n\/\/    \u30c7\u30b9\u30c8\u30e9\u30af\u30bf\n\/\/ parameter\n\/\/    \u306a\u3057\n\/\/ return\n\/\/    \u306a\u3057\n\/\/&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-\nCMyThread::~CMyThread()\n{\n}\n\n\/\/&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-\n\/\/ function\n\/\/    \u6a5f\u80fd\u3092\u8a18\u8ff0\u3057\u305f\u95a2\u6570\n\/\/ parameter\n\/\/    \u306a\u3057\n\/\/ return\n\/\/    0(\u7279\u306b\u30a8\u30e9\u30fc\u3082\u306a\u3044\u306e\u3067)\n\/\/&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-\nUINT CMyThread::DoWork()\n{\n    int        ii;\n    DWORD    dwPrevTime = 0, dwNowTime;                \/\/ \u524d\u56de\u8868\u793a\u3057\u305f\u6642\u523b\u3001\u73fe\u5728\u6642\u523b\n\n    while (!m_fStopFlag)\n    {\n        dwNowTime = timeGetTime();                    \/\/ \u73fe\u5728\u6642\u523b(Windows\u306e\u8d77\u52d5\u304b\u3089\u306emsec)\n        \/\/ \u524d\u56de\u306e\u8868\u793a\u6642\u523b\u304b\u3089dwTimer\u7d4c\u904e\u3057\u305f\u304b\n        if (GetdwInterval(dwNowTime, dwPrevTime) &lt;= m_pMyData-&lt;dwTimer)\n        {\n            m_pMyData-&lt;pCMySyncObject-&lt;Lock();        \/\/ \u2605\u6240\u6709\u6a29\u3092\u53d6\u5f97\u3059\u308b\u307e\u3067\u5f85\u3064\n            \/\/ \u6307\u5b9a\u3055\u308c\u305f\u6761\u4ef6\u3067\u6587\u5b57\u3092\u8868\u793a\u3059\u308b\n            for (ii = 0; ii &lt; m_pMyData-&lt;iNum; ++ii)\n            {\n                fprintf(stderr, &#8220;%c&#8221;, m_pMyData-&lt;cData);\n                Sleep(m_pMyData-&lt;dwCharacterInterval);\n            }\n            fprintf(stderr, &#8220;\\n&#8221;);\n            m_pMyData-&lt;pCMySyncObject-&lt;UnLock();      \/\/ \u2605\u6240\u6709\u6a29\u3092\u958b\u653e\u3059\u308b\n            dwPrevTime = dwNowTime;                   \/\/ \u8868\u793a\u3057\u305f\u6642\u523b\u3092\u899a\u3048\u308b\n        }\n    }\n    return(1);\n}<\/p>\n\n\n\n<p class=\"program_discription\">\u30e1\u30a4\u30f3\u30d7\u30ed\u30b0\u30e9\u30e0(PrintMAC.cpp)\u540c\u671f\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3092CMySyncObject\u306b<br>\u7f6e\u304d\u63db\u3048\u308c\u3070\u5b8c\u6210\u3067\u3059\u3002<\/p>\n\n\n\n<p class=\"source_code\">\u3010PrintMAC.cpp\u3011\n#include &#8220;MyThread.h&#8221;\n#include &#8220;MySyncObject.h&#8221;      \/\/ \u2605CMySyncObject\u3092\u4f7f\u3046\u305f\u3081\n\nint main(int argc, char *argv[])\n{\n    MyDataRec    MyData[3] = { { &#8216;A&#8217;, 1000, 50, 10 }, {&#8216;B&#8217;, 2000, 100, 5}, {&#8216;C&#8217;, 3300, 200, 4} };\n    CMyThread    *pCMyThread[3] = { NULL };\n    int            ii;\n    CMySyncObject    *pCMySyncObject;                    \/\/ \u2605\n\n    pCMySyncObject = new CMySyncObject();                \/\/ \u2605\n    pCMySyncObject-&gt;Initialize();                        \/\/ \u540c\u671f\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u306e\u521d\u671f\u5316\n    for (ii = 0; ii &lt; 3; ++ii)                           \/\/ \u30d1\u30e9\u30e1\u30fc\u30bf\u306b\u30bb\u30c3\u30c8\n        MyData[ii].pCMySyncObject = pCMySyncObject;      \/\/\n\n    for (ii = 0; ii &lt; 3; ++ii)\n    {\n        pCMyThread[ii] = new CMyThread(&amp;MyData[ii]);     \/\/ \u30d1\u30e9\u30e1\u30fc\u30bf(\u69cb\u9020\u4f53)\u306e\u30dd\u30a4\u30f3\u30bf\u3092\u6e21\u3059\n        pCMyThread[ii]-&gt;Begin();                         \/\/ \u958b\u59cb\n    }\n    getchar();                                           \/\/ Enter\u30ad\u30fc\u5f85\u3061\n\n    for (ii = 0; ii &lt; 3; ++ii)\n        pCMyThread[ii]-&gt;End();                           \/\/ \u30b9\u30ec\u30c3\u30c9\u306b\u7d42\u4e86\u3092\u901a\u77e5\n    for (ii = 0; ii &lt; 3; ++ii)\n    {\n        pCMyThread[ii]-&gt;WaitForEnd();                    \/\/ \u7d42\u4e86\u3059\u308b\u306e\u3092\u5f85\u3064\n        SAFE_DELETE(pCMyThread[ii])                      \/\/ \u30af\u30e9\u30b9\u306e\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u306e\u7834\u68c4\n    }\n    pCMySyncObject-&gt;Uninitialize();                      \/\/ \u2605\u540c\u671f\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u306e\u958b\u653e\n    SAFE_DELETE(pCMySyncObject)                          \/\/\n    return(0);\n}<\/p>\n\n\n\n<p class=\"program_discription\">\u30e1\u30a4\u30f3\u30d7\u30ed\u30b0\u30e9\u30e0(PrintMAC.cpp)\u306b\u306f\u3001Windows\u72ec\u81ea\u306e\u8a18\u8ff0\u304c\u306a\u3044\u3053\u3068\u304c\u308f\u304b\u308a\u307e\u3059\u3002<br>\u307e\u305f\u3001\u3053\u306e\u30d7\u30ed\u30b0\u30e9\u30e0\u306e\u6a5f\u80fd(\u6587\u5b57\u3092\u6307\u5b9a\u3055\u308c\u305f\u6761\u4ef6\u3067\u8868\u793a\u3059\u308b)\u3092\u8a18\u8ff0\u3057\u3066\u3044\u308b<br>MyThread.cpp\u3082Windows\u72ec\u81ea\u306e\u8a18\u8ff0\u306fSleep\u3060\u3051\u3060\u3068\u3044\u3046\u3053\u3068\u304c\u308f\u304b\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<p class=\"program_discription\">\u6b21\u306b<strong>\u30de\u30eb\u30c1\u30b9\u30ec\u30c3\u30c9\u30d7\u30ed\u30b0\u30e9\u30e0 \u6392\u4ed6\u51e6\u7406\uff08\u540c\u671f\u5236\u5fa1\uff09\u306e\u30af\u30e9\u30b9\u5bfe\u5fdcLinux\u7248<\/strong><br>\u3092\u3084\u3063\u3066\u307f\u307e\u3059\u3002<br>\u524d\u56de\u4f5c\u6210\u3057\u305f<a href=\"https:\/\/www.oji-koji.com\/?p=1205\" target=\"_blank\" rel=\"noreferrer noopener\" aria-label=\"PrintMACMutex\u306eLinux\u7248 (\u65b0\u3057\u3044\u30bf\u30d6\u3067\u958b\u304f)\">PrintMACMutex\u306eLinux\u7248<\/a>\u3092\u5143\u306b\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<p class=\"program_discription\">\u524d\u56de\u4f5c\u6210\u3057\u305f\u30d7\u30ed\u30b8\u30a7\u30af\u30c8(PrintMACCriticalSection)\u3092\u30b3\u30d4\u30fc\u3057\u3001\u30d5\u30a9\u30eb\u30c0\u540d\u3001<br>\u30bd\u30ea\u30e5\u30fc\u30b7\u30e7\u30f3\u540d\u3001\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u540d\u3092PrintMACSync\u306b\u5909\u66f4\u3057\u307e\u3059\u3002<br>\u65b0\u898f\u8ffd\u52a0\u3067\u3001C++\u306e\u30af\u30e9\u30b9CMySyncObject\u3092\u8ffd\u52a0\u3057\u307e\u3059\u3002<br>\u30d5\u30a1\u30a4\u30eb\u540d\uff1aMySyncObject.cpp\u3001MySyncObject.h<\/p>\n\n\n\n<p class=\"source_code\">\u3010makefile\u3011\nCC=g++ -g -O0\n#CC=g++\nPROGRAM=PrintMACSync\nOBJS=PrintMAC.o ThreadJob.o MyThread.o stdThread.o MySyncObject.o\n\nSRCS=$(OBJS:%.o=%.cpp)\nINCLUDE=stdThread.h\nLFLAGS=-lpthread\n\n$(PROGRAM):$(OBJS) $(SRCS) $(INCLUDE)\n\t$(CC) -o $(PROGRAM) $(SRCS) $(LFLAGS)<\/p>\n\n\n\n<p class=\"program_discription\"><\/p>\n\n\n\n<p class=\"source_code\">\u3010MySyncObject.h\u3011\n#pragma once\n#include &#8220;stdThread.h&#8221;\n\nclass CMySyncObject\n{\npublic:\n    CMySyncObject();\n    ~CMySyncObject();\n\n    BOOL    Initialize();        \/\/ \u521d\u671f\u5316\n    BOOL    Uninitialize();        \/\/ \u958b\u653e\n    BOOL    Lock();                \/\/ \u30ed\u30c3\u30af(\u6240\u6709\u6a29\u53d6\u5f97\u5f85\u3061)\n    BOOL    UnLock();            \/\/ \u30a2\u30f3\u30ed\u30c3\u30af(\u6240\u6709\u6a29\u958b\u653e)\n\nprivate:\n    pthread_mutex_t    m_Mutex;    \/\/ \u30df\u30e5\u30fc\u30c6\u30c3\u30af\u30b9\u3092\u4f7f\u3044\u307e\u3059\n};<\/p>\n\n\n\n<p class=\"program_discription\"><\/p>\n\n\n\n<p class=\"source_code\">\u3010MySyncObject.cpp\u3011\n#include &#8220;MySyncObject.h&#8221;\n\nCMySyncObject::CMySyncObject()\n{\n}\n\n\nCMySyncObject::~CMySyncObject()\n{\n}\n\nBOOL CMySyncObject::Initialize()\n{\n    pthread_mutex_init(&amp;m_Mutex, NULL);    \/\/ \u30df\u30e5\u30fc\u30c6\u30c3\u30af\u30b9\u306e\u521d\u671f\u5316\n    return(TRUE);\n}\n\nBOOL CMySyncObject::Uninitialize()\n{\n    pthread_mutex_destroy(&amp;m_Mutex);       \/\/ \u30df\u30e5\u30fc\u30c6\u30c3\u30af\u30b9\u306e\u7834\u68c4\n    return(TRUE);\n}\n\nBOOL CMySyncObject::Lock()                 \/\/ \u6240\u6709\u6a29\u3092\u53d6\u5f97\u3059\u308b\u307e\u3067\u5f85\u3064\n{\n    pthread_mutex_lock(&amp;m_Mutex);\n    return(TRUE);\n}\n\nBOOL CMySyncObject::UnLock()               \/\/ \u6240\u6709\u6a29\u3092\u958b\u653e\u3059\u308b\n{\n    pthread_mutex_unlock(&amp;m_Mutex);\n    usleep(0);                             \/\/ \u4ed6\u306e\u30b9\u30ec\u30c3\u30c9\u306b\u5b9f\u884c\u306e\u30c1\u30e3\u30f3\u30b9\u3092\u4e0e\u3048\u308b\n    return(TRUE);\n}<\/p>\n\n\n\n<p class=\"program_discription\"><\/p>\n\n\n\n<p class=\"source_code\">\u3010MyThread.h\u3011\n#pragma once\n#include &#8220;ThreadJob.h&#8221;\n\nclass CMySyncObject;            \/\/ \u2605\u3053\u306e\u30af\u30e9\u30b9\u306e\u4f7f\u7528\u3059\u308b\u3053\u3068\u3092\u5ba3\u8a00\n\n\/\/ \u5fc5\u8981\u306a\u30d1\u30e9\u30e1\u30fc\u30bf\u3092\u69cb\u9020\u4f53\u306b\u3059\u308b\ntypedef struct\n{\n    char    cData;                    \/\/ \u8868\u793a\u3059\u308b\u6587\u5b57\n    DWORD   dwTimer;                  \/\/ \u8868\u793a\u9593\u9694(msec)\n    DWORD   dwCharacterInterval;      \/\/ \u6587\u5b57\u9593(msec)\n    int     iNum;                     \/\/ \u8868\u793a\u3059\u308b\u500b\u6570\n    CMySyncObject *pCMySyncObject;    \/\/ \u2605\u540c\u671f\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\n} MyDataRec;\n\n\nclass CMyThread : public CThreadJob\n{\npublic:\n    CMyThread(MyDataRec *pData);     \/\/ \u30d1\u30e9\u30e1\u30fc\u30bf\u3092\u30b3\u30f3\u30b9\u30c8\u30e9\u30af\u30bf\u3067\u6e21\u3059\n    ~CMyThread();\n    \/\/ \u57fa\u5e95\u30af\u30e9\u30b9\u306e\u95a2\u6570\u3092\u30aa\u30fc\u30d0\u30fc\u30e9\u30a4\u30c9\u3059\u308b\n    \/\/ C++11\u3067\u660e\u793a\u7684\u306boverride\u3092\u66f8\u304f\u3053\u3068\u304c\u51fa\u6765\u308b\u3088\u3046\u306b\u306a\u308a\u307e\u3057\u305f\n    \/\/ \u57fa\u5e95\u30af\u30e9\u30b9\u306e\u5f53\u8a72\u95a2\u6570\u306bvirtual\u304c\u66f8\u3044\u3066\u3044\u306a\u3044\u3068\u30a8\u30e9\u30fc\u3092\u51fa\u3057\u3066\u304f\u308c\u307e\u3059\n    UINT DoWork() override;          \/\/ cData\u3092dwTime(msec)\u9593\u9694\u3067\u8868\u793a\u3059\u308b\nprivate:\n    MyDataRec    *m_pMyData;         \/\/ \u30b3\u30f3\u30b9\u30c8\u30e9\u30af\u30bf\u3067\u6e21\u3055\u308c\u308b\u30d1\u30e9\u30e1\u30fc\u30bf\u3092\u683c\u7d0d\n                                     \/\/ \u3053\u306e\u30b9\u30ec\u30c3\u30c9\u5b9f\u884c\u4e2d\u9818\u57df\u304c\u78ba\u4fdd\u3055\u308c\u3066\u3044\u308b\u3053\u3068\n};<\/p>\n\n\n\n<p class=\"program_discription\"><\/p>\n\n\n\n<p class=\"source_code\">\u3010MyThread.cpp\u3011\n#include &#8220;MyThread.h&#8221;\n#include &#8220;MySyncObject.h&#8221;        \/\/ \u2605CMySyncObject\u3092\u4f7f\u3046\u305f\u3081\n\n\/\/&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-\n\/\/ function\n\/\/    \u30b3\u30f3\u30b9\u30c8\u30e9\u30af\u30bf\n\/\/ parameter\n\/\/    MyDataRec *pData    [in]\u6a5f\u80fd\u306b\u5fc5\u8981\u306a\u60c5\u5831\n\/\/ return\n\/\/    \u306a\u3057\n\/\/&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-\nCMyThread::CMyThread(MyDataRec *pData)\n{\n    m_pMyData = pData;\n}\n\n\/\/&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-\n\/\/ function\n\/\/    \u30c7\u30b9\u30c8\u30e9\u30af\u30bf\n\/\/ parameter\n\/\/    \u306a\u3057\n\/\/ return\n\/\/    \u306a\u3057\n\/\/&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-\nCMyThread::~CMyThread()\n{\n}\n\n\/\/&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-\n\/\/ function\n\/\/    \u6a5f\u80fd\u3092\u8a18\u8ff0\u3057\u305f\u95a2\u6570\n\/\/ parameter\n\/\/    \u306a\u3057\n\/\/ return\n\/\/    0(\u7279\u306b\u30a8\u30e9\u30fc\u3082\u306a\u3044\u306e\u3067)\n\/\/&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-\nUINT CMyThread::DoWork()\n{\n    int        ii;\n    DWORD    dwPrevTime = 0, dwNowTime;\n\n    while (!m_fStopFlag)\n    {\n        dwNowTime = timeGetTime();\n        if (GetdwInterval(dwNowTime, dwPrevTime) &gt;= m_pMyData-&gt;dwTimer)\n        {\n            m_pMyData-&gt;pCMySyncObject-&gt;Lock();        \/\/ \u2605\u6240\u6709\u6a29\u3092\u53d6\u5f97\u3059\u308b\u307e\u3067\u5f85\u3064\n            for (ii = 0; ii &lt; m_pMyData-&gt;iNum; ++ii)\n            {\n                fprintf(stderr, &#8220;%c&#8221;, m_pMyData-&gt;cData);\n                usleep(m_pMyData-&gt;dwCharacterInterval * 1000);\n            }\n            fprintf(stderr, &#8220;\\n&#8221;);\n            m_pMyData-&gt;pCMySyncObject-&gt;UnLock();    \/\/ \u2605\u6240\u6709\u6a29\u3092\u958b\u653e\u3059\u308b\n            dwPrevTime = dwNowTime;\n        }\n    }\n    return(1);\n}<\/p>\n\n\n\n<p class=\"program_discription\"><\/p>\n\n\n\n<p class=\"source_code\">\u3010PrintMAC.cpp\u3011\n#include &#8220;MyThread.h&#8221;\n#include &#8220;MySyncObject.h&#8221;        \/\/ \u2605CMySyncObject\u3092\u4f7f\u3046\u305f\u3081\n\nint main(int argc, char *argv[])\n{\n    MyDataRec    MyData[3] = { { &#8216;A&#8217;, 1000, 50, 25 }, {&#8216;B&#8217;, 2000, 100, 5}, {&#8216;C&#8217;, 3300, 200, 4} };\n    CMyThread    *pCMyThread[3] = { NULL };\n    int          ii;\n    CMySyncObject  *pCMySyncObject;                      \/\/ \u2605\n\n    pCMySyncObject = new CMySyncObject();                \/\/ \u2605\n    pCMySyncObject-&gt;Initialize();                        \/\/ \u2605\u540c\u671f\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u306e\u521d\u671f\u5316\n    for (ii = 0; ii \t 3; ++ii)\n        MyData[ii].pCMySyncObject = pCMySyncObject;\n\n    for (ii = 0; ii \t 3; ++ii)\n    {\n        pCMyThread[ii] = new CMyThread(&amp;MyData[ii]);    \/\/ \u30d1\u30e9\u30e1\u30fc\u30bf(\u69cb\u9020\u4f53)\u306e\u30dd\u30a4\u30f3\u30bf\u3092\u6e21\u3059\n        pCMyThread[ii]-&gt;Begin();                        \/\/ \u958b\u59cb\n    }\n    getchar();                                          \/\/ Enter\u30ad\u30fc\u5f85\u3061\n\n    for (ii = 0; ii \t 3; ++ii)\n        pCMyThread[ii]-&gt;End();                          \/\/ \u30b9\u30ec\u30c3\u30c9\u306b\u7d42\u4e86\u3092\u901a\u77e5\n    for (ii = 0; ii \t 3; ++ii)\n    {\n        pCMyThread[ii]-&gt;WaitForEnd();                   \/\/ \u7d42\u4e86\u3059\u308b\u306e\u3092\u5f85\u3064\n        SAFE_DELETE(pCMyThread[ii])                     \/\/ \u30af\u30e9\u30b9\u306e\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u306e\u7834\u68c4\n    }\n    pCMySyncObject-&gt;Uninitialize();                     \/\/ \u2605\u540c\u671f\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u306e\u958b\u653e\n    SAFE_DELETE(pCMySyncObject)\n    return(0);\n}<\/p>\n\n\n\n<p class=\"program_discription\">\u30de\u30eb\u30c1\u30b9\u30ec\u30c3\u30c9\u6a5f\u80fd\u306e\u5b9f\u73fe\u3001\u540c\u671f\u51e6\u7406\u306e\u5b9f\u73fe\u90e8\u5206\u306b\u3064\u3044\u3066\u304b\u306a\u308a<br>\u5358\u7d14\u5316\u30fb\u5171\u901a\u5316\u304c\u3067\u304d\u307e\u3057\u305f<br>\u6b21\u56de\u304b\u3089\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u30d7\u30ed\u30b0\u30e9\u30e0(SimpleServer, SimpleClient)\u306b<br>\u30de\u30eb\u30c1\u30b9\u30ec\u30c3\u30c9\u6a5f\u80fd\u3092\u5b9f\u73fe\u3059\u308b\u3053\u3068\u306b\u3057\u307e\u3057\u3087\u3046\u3002<\/p>\n\n\n\n<p><a href=\"https:\/\/www.oji-koji.com\/pro-files\/PrintMACSyncWin.zip\">\u30d7\u30ed\u30b8\u30a7\u30af\u30c8PrintMACSync for Windows<\/a><\/p>\n\n\n\n<p><a href=\"https:\/\/www.oji-koji.com\/pro-files\/PrintMACSyncLinux.zip\">\u30d7\u30ed\u30b8\u30a7\u30af\u30c8PrintMACSync for Linux<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u30de\u30eb\u30c1\u30b9\u30ec\u30c3\u30c9\u3092\u5b9f\u73fe\u3059\u308b\u57fa\u672c\u30af\u30e9\u30b9\u306b\u3088\u3063\u3066\u3001Linux, Windows\u306e\u30d7\u30ed\u30b0\u30e9\u30e0\u3092\u304b\u306a\u308a\u5171\u901a\u5316\u3067\u304d\u307e\u3057\u305f\u3002\u3057\u304b\u3057\u3001\u540c\u671f\u51e6\u7406\u3092\u8ffd\u52a0\u3057\u305f\u3053\u3068\u3067\u3001\u305d\u306e\u90e8\u5206\u306e\u5171\u901a\u5316\u304c\u5d29\u308c\u3066\u3057\u307e\u3044\u307e\u3057\u305f\u3002\u3053\u3053\u3067\u306f\u3001\u540c\u671f\u51e6\u7406\u306e\u305f\u3081\u306e\u30af\u30e9\u30b9\u3092\u4f5c\u6210 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":129,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_locale":"ja","_original_post":"https:\/\/www.oji-koji.com\/?p=1308","footnotes":""},"categories":[6],"tags":[],"class_list":["post-1308","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-networkprograming","ja"],"_links":{"self":[{"href":"https:\/\/www.oji-koji.com\/index.php?rest_route=\/wp\/v2\/posts\/1308","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.oji-koji.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.oji-koji.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.oji-koji.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.oji-koji.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1308"}],"version-history":[{"count":26,"href":"https:\/\/www.oji-koji.com\/index.php?rest_route=\/wp\/v2\/posts\/1308\/revisions"}],"predecessor-version":[{"id":3088,"href":"https:\/\/www.oji-koji.com\/index.php?rest_route=\/wp\/v2\/posts\/1308\/revisions\/3088"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.oji-koji.com\/index.php?rest_route=\/wp\/v2\/media\/129"}],"wp:attachment":[{"href":"https:\/\/www.oji-koji.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1308"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.oji-koji.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1308"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.oji-koji.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1308"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}