1. 程式人生 > 實用技巧 >NX二次開發-C++多執行緒技術做exe外部開發(批量匯出PDF圖紙例子)

NX二次開發-C++多執行緒技術做exe外部開發(批量匯出PDF圖紙例子)

NX11+VS2013

/*****************************************************************************
**
** NX11_Open_Wizard1.cpp
**
** Description:
**    Main file for the application.
**
*****************************************************************************/

/* Include files */
#include <stdarg.h>
#include 
<strstream> #include <iostream> using std::ostrstream; using std::endl; using std::ends; using std::cerr; #include <uf.h> #include <uf_ui_types.h> //標頭檔案 #include <afxwin.h> #include <windows.h> #include <uf.h> #include <uf_part.h> #include <uf_defs.h> #include
<NXOpen/NXException.hxx> #include <NXOpen/Session.hxx> #include <NXOpen/BasePart.hxx> #include <NXOpen/Builder.hxx> #include <NXOpen/Drawings_DrawingSheet.hxx> #include <NXOpen/Drawings_DrawingSheetCollection.hxx> #include <NXOpen/NXObject.hxx> #include <NXOpen/Part.hxx> #include
<NXOpen/PartCollection.hxx> #include <NXOpen/PlotManager.hxx> #include <NXOpen/PlotSourceBuilder.hxx> #include <NXOpen/PrintPDFBuilder.hxx> #include <NXOpen/Session.hxx> using namespace NXOpen; /* Main routine */ extern void main( char argc, char *argv[] ) { /* Initialize the API environment */ UF_initialize(); /* TODO: Add your application code here */ //調exe傳入引數 LPWSTR *szArglist = NULL; int nArgs = 0; szArglist = CommandLineToArgvW(GetCommandLineW(), &nArgs); if (nArgs > 1) { CString str1 = szArglist[1]; //開啟prt tag_t PartTag = NULL_TAG; UF_PART_load_status_t ErrorStatus; UF_PART_open("D:\\2\\1.prt", &PartTag, &ErrorStatus); NXOpen::Session *theSession = NXOpen::Session::GetSession(); NXOpen::Part *workPart(theSession->Parts()->Work()); NXOpen::Part *displayPart(theSession->Parts()->Display()); NXOpen::PrintPDFBuilder *printPDFBuilder1; printPDFBuilder1 = workPart->PlotManager()->CreatePrintPdfbuilder(); printPDFBuilder1->SetScale(1.0); printPDFBuilder1->SetSize(NXOpen::PrintPDFBuilder::SizeOptionScaleFactor); printPDFBuilder1->SetUnits(NXOpen::PrintPDFBuilder::UnitsOptionEnglish); printPDFBuilder1->SetXDimension(8.5); printPDFBuilder1->SetYDimension(11.0); printPDFBuilder1->SetOutputText(NXOpen::PrintPDFBuilder::OutputTextOptionPolylines); printPDFBuilder1->SetRasterImages(true); printPDFBuilder1->SetWatermark(""); std::vector<NXOpen::NXObject *> sheets1(1); NXOpen::Drawings::DrawingSheet *drawingSheet1(dynamic_cast<NXOpen::Drawings::DrawingSheet *>(workPart->DrawingSheets()->FindObject("Sheet 1"))); sheets1[0] = drawingSheet1; printPDFBuilder1->SourceBuilder()->SetSheets(sheets1); char msg[256]; sprintf_s(msg, "D:\\2\\%s.pdf", (LPSTR)(LPCTSTR)str1); printPDFBuilder1->SetFilename(msg); NXOpen::NXObject *nXObject1; nXObject1 = printPDFBuilder1->Commit(); printPDFBuilder1->Destroy(); //關閉prt UF_PART_close(PartTag, 1, 1); } //取得引數後,釋放CommandLineToArgvW申請的空間 LocalFree(szArglist); /* Terminate the API environment */ UF_terminate(); } /***************************************************************************** ** Utilities *****************************************************************************/ Caesar盧尚宇 2020年10月24日

VS2013

#include <stdio.h>
#include <windows.h>

DWORD WINAPI ThreadProc1(LPVOID lpParameter)
{
    printf("執行緒1開始\n");

    int* p = (int*)lpParameter;//傳入引數轉換

    for (int i = 0; i < 10; i++)
    {
        printf(".\n");
        char msg[256];
        sprintf_s(msg, "D:\\2\\1.exe %d", *p);
        system(msg);

        (*p)++;
    }

    printf("執行緒1結束\n");
    return 0;
}


DWORD WINAPI ThreadProc2(LPVOID lpParameter)
{
    printf("執行緒2開始\n");

    int* p = (int*)lpParameter;//傳入引數轉換

    for (int i = 0; i < 10; i++)
    {
        printf(".\n");
        char msg[256];
        sprintf_s(msg, "D:\\2\\1.exe %d", *p+10);
        system(msg);

        (*p)++;
    }

    printf("執行緒2結束\n");
    return 0;
}


void main()
{
    int a = 0;//傳入執行緒函式的引數,不需傳遞引數時為NULL
    int b = 0;

    //建立執行緒1
    DWORD lpThreadId1 = 0;//傳出引數,用於獲得執行緒ID,如果為NULL則不返回
    HANDLE hThread1 = CreateThread(NULL, 0, ThreadProc1, &a, 0, &lpThreadId1);

    //WaitForSingleObject(hThread1, INFINITE);//等待單個物件

    //建立執行緒2
    DWORD lpThreadId2 = 0;
    HANDLE hThread2 = CreateThread(NULL, 0, ThreadProc2, &b, 0, &lpThreadId2);

    getchar();
}

Caesar盧尚宇
2020年10月24日

VS2013

#include <stdio.h>
#include <windows.h>


/*
HANDLE WINAPI CreateThread(
LPSECURITY_ATTRIBUTES   lpThreadAttributes, //執行緒安全相關的屬性,常置為NULL
SIZE_T                  dwStackSize,        //新執行緒的初始化棧在大小,可設定為0
LPTHREAD_START_ROUTINE  lpStartAddress,     //被執行緒執行的回撥函式,也稱為執行緒函式
LPVOID                  lpParameter,        //傳入執行緒函式的引數,不需傳遞引數時為NULL
DWORD                   dwCreationFlags,    //控制執行緒建立的標誌
LPDWORD                 lpThreadId          //傳出引數,用於獲得執行緒ID,如果為NULL則不返回執行緒ID
);
*/


DWORD WINAPI ThreadProc1(LPVOID lpParameter)
{
    int* p = (int*)lpParameter;//傳入引數轉換

    for (int i = 0; i < 10; i++)
    {
        printf("%d\n", *p);
        (*p)++;
        Sleep(1000);
    }



    return 0;
}


DWORD WINAPI ThreadProc2(LPVOID lpParameter)
{
    for (int i = 0; i < 10; i++)
    {
        printf("%d\n", i);
        Sleep(1000);
    }
    return 0;
}


void main()
{
    int a = 0;//傳入執行緒函式的引數,不需傳遞引數時為NULL

    //建立執行緒1
    DWORD lpThreadId1 = 0;//傳出引數,用於獲得執行緒ID,如果為NULL則不返回
    HANDLE hThread1 = CreateThread(NULL, 0, ThreadProc1, &a, 0, &lpThreadId1);

    //WaitForSingleObject(hThread1, INFINITE);//等待單個物件

    //建立執行緒2
    DWORD lpThreadId2 = 0;
    HANDLE hThread2 = CreateThread(NULL, 0, ThreadProc2, &a, 0, &lpThreadId2);



    getchar();

}

Caesar盧尚宇
2020年10月24日