1. 程式人生 > >VC印表機程式設計之兩篇有用的文章獲取印表機與列印作業的狀態和設定印表機模式並預覽列印

VC印表機程式設計之兩篇有用的文章獲取印表機與列印作業的狀態和設定印表機模式並預覽列印

VC印表機程式設計之兩篇有用的文章

vc設定印表機模式並預覽列印  

呼叫列印屬性對話方塊:
if(::OpenPrinter("Adobe PDF", &hPrint, NULL))
{
::PrinterProperties(m_hWnd, hPrint);
::ClosePrinter(hPrint);
}
注:通過EnumPrinters可以列舉全部的本地、網路印表機資訊,通過指定以上的方法,可以開啟印表機屬性對話方塊,建議通過以上方法修改印表機固定屬性,比較安全。
列舉印表機
需要呼叫兩次EnumPrinters函式,第一次的到結構體的大小,第二次得到印表機列表
DWORD dwNeeded, dwReturn;
// 得到結構大小
BOOL bl = ::EnumPrinters(PRINTER_ENUM_LOCAL | PRINTER_ENUM_CONNECTIONS, NULL, 4, NULL, 0,&dwNeeded, &dwReturn);


// 得到印表機裝置列表
PRINTER_INFO_4* p4;
p4 = (PRINTER_INFO_4*)malloc(dwNeeded);
::EnumPrinters(PRINTER_ENUM_LOCAL | PRINTER_ENUM_CONNECTIONS, NULL, 4, (PBYTE)p4, dwNeeded,&dwNeeded, &dwReturn);
for(int i=0;i< div> < dwNeeded;i++)
{
TRACE("This is printer name : %s\r\n", p4[i].pPrinterName);
}
// 注意以上程式碼,NT以上系統支援,98不支援
最簡單的一段列印程式
流程:
1、得到預設印表機名稱(如果你不打算更改印表機的話,就不需要儲存該選項)
2、儲存預設印表機名稱
3、設定新的預設印表機
4、取得預設印表機的選項
5、修改屬性,如紙張選擇,橫縱等。6、列印輸出
7、還原預設列印裝置
// 得到預設列印裝置名稱
CString strDefualtDev = TEXT("");
PRINTDLG pd;
LPDEVMODE lpDevMode;
if(AfxGetApp()->GetPrinterDeviceDefaults(&pd))
{
lpDevMode=(LPDEVMODE)GlobalLock(pd.hDevMode);
if(lpDevMode)

strDefualtDev = lpDevMode->dmDeviceName;
}
GlobalUnlock(pd.hDevMode);
}
// 指定的印表機名稱
::SetDefaultPrinter("Adobe PDF");  // 在這裡我選擇的印表機是選定的Adobe虛擬印表機
// 得到剛剛設定的印表機名稱
if(AfxGetApp()->GetPrinterDeviceDefaults(&pd))   
{
lpDevMode=(LPDEVMODE)GlobalLock(pd.hDevMode);       
if(lpDevMode)

lpDevMode->dmPaperSize=DMPAPER_A4;    // 設定列印紙張幅面
lpDevMode->dmOrientation=DMORIENT_LANDSCAPE; // 設定橫向列印
lpDevMode->dmPrintQuality=600;     // 設定印表機解析度
}  
GlobalUnlock(pd.hDevMode);
}
DOCINFO di;
memset( &di, 0, sizeof(DOCINFO) );
di.cbSize = sizeof(DOCINFO); 
di.lpszDocName = "Bitmap Printing Test"; // 設定列印文件名稱
di.lpszOutput = (LPTSTR) NULL; 
di.fwType = 0; 
// Begin a print job by calling the StartDoc function. 
int nError;
HDC hdc = ::CreateDC(NULL, "Adobe PDF", NULL, lpDevMode); // 得到印表機裝置控制代碼
if(hdc != NULL)
{
if((nError = StartDoc(hdc, &di)) > 0)
{
if(StartPage(hdc)>0)
{
int xPage = ::GetDeviceCaps(hdc, HORZRES); // 得到可列印紙張的高度
int yPage = ::GetDeviceCaps(hdc, VERTRES); // 得到可列印紙張的寬度
// 在一下地方進行列印輸出
if(EndPage(hdc)>0) // 只有結束頁成功了才可以關閉文件
EndDoc(hdc); // 關閉列印文件
}
}
}
/// 還原預設的列印裝置設定
::SetDefaultPrinter(strDefualtDev); 


/////////////////////////開始調取印表機-operation 001 ////////////////////////////////////
PRINTDLG printInfo;
ZeroMemory(&printInfo,sizeof(printInfo));  //清空該結構
printInfo.lStructSize = sizeof(printInfo);   
printInfo.hwndOwner = 0;   
printInfo.hDevMode = 0;
printInfo.hDevNames = 0;
//這個是關鍵,PD_RETURNDC 如果不設這個標誌,就拿不到hDC了
//            PD_RETURNDEFAULT 這個就是得到預設印表機,不需要彈設定對話方塊
printInfo.Flags = PD_RETURNDC | PD_RETURNDEFAULT;  


PrintDlg(&printInfo);//呼叫API拿出預設印表機
DWORD rst = CommDlgExtendedError();//看看出錯沒有
if(rst != 0)
{//出錯了,清空標誌再次呼叫API,此時就會彈出列印設定對話方塊供使用者選擇了
MessageBox("預設印表機調取失敗,請手動選擇!");
printInfo.Flags = 0;
PrintDlg(&printInfo);
}
////////////////////////////001- end ////////////////////////////////////////////
////////////////////自定義紙張大小//////////////////////////////////////////////////
/*
//首先得到DEVMODE結構,同時申請系統鎖定,我們要修改它了
LPDEVMODE lpDevMode = (LPDEVMODE)::GlobalLock(printInfo.hDevMode);
if(lpDevMode)  //成功得到該結構了
{
lpDevMode->dmPaperSize = DMPAPER_USER;  //自定義紙張


  //設定自定義紙張標誌
  lpDevMode->dmFields = lpDevMode ->dmFields | DM_PAPERSIZE | DM_PAPERLENGTH | DM_PAPERWIDTH; 
  
lpDevMode->dmPaperWidth = (short)width; //紙寬多少
lpDevMode->dmPaperLength = (short)height; //紙高多少

 //順便設定紙張走紙方向,橫向還是縱向
 lpDevMode->dmOrientation = DMORIENT_PORTRAIT;
 }
 //記住要解鎖
 GlobalUnlock(printInfo.hDevMode);
 
//這個也不能忘了,否則更改不會生效
ResetDC(printInfo.hDC, lpDevMode);
*/
HDC printDC=printInfo.hDC; //得到列印DC,輸出到列印,
CDC cdc;
cdc.Attach(printDC);


得到了 dc之後就不用我再說了吧,自己搞定就是了,
————————————————————————————————————————————————
void   PrintTest()   
{   
CPrintDialog   pd(FALSE,   PD_ALLPAGES   |   PD_COLLATE   |   PD_NOPAGENUMS   |   
PD_HIDEPRINTTOFILE);   
if(pd.GetDefaults())   
{   
DOCINFO   di;   
memset(   &di,   0,   sizeof(DOCINFO)   );   
di.cbSize   =   sizeof(DOCINFO);     
di.lpszDocName   =   "Printing   Test";     
di.lpszOutput   =   (LPTSTR)   NULL;     
di.fwType   =   0;     
HDC   hDC=pd.CreatePrinterDC();   
CDC   dc;   
dc.Attach(hDC);   
dc.StartDoc(&di);     
dc.StartPage();     
dc.MoveTo(0,0);   
dc.LineTo(1000,1000);   
dc.EndPage();     
dc.EndDoc();       
dc.DeleteDC();     
}   



HDC hdcPrint = GetDefaultPrinterDC();
CPrintDialog pd(FALSE,PD_ALLPAGES|PD_ALLPAGES|PD_NOPAGENUMS,NULL);
pd.DoModal();
HDC hdcPrint = pd.CreatePrinterDC();
if(hdcPrint == NULL)
{
MessageBox("印表機初始化失敗!", "錯誤", MB_ICONSTOP);
return;
}




/*   設定系統列印模式                 
#define   DMORIENT_PORTRAIT       1       //縱向   
#define   DMORIENT_LANDSCAPE     2       //橫向                                           


*/   
/************************************************************************/   
void   CXTReportApp::SetLandscapeMode(int   PrintMode)   
{   
PRINTDLG   pd;   
pd.lStructSize=(DWORD)sizeof(PRINTDLG);   
BOOL   bRet=GetPrinterDeviceDefaults(&pd);   
if(bRet)   
{   
//   protect   memory   handle   with   ::GlobalLock   and   ::GlobalUnlock   
DEVMODE   FAR   *pDevMode=(DEVMODE   FAR   *)::GlobalLock(m_hDevMode);   
//   set   orientation   to   landscape   
if(PrintMode==1)//縱向列印   
pDevMode->dmOrientation=DMORIENT_PORTRAIT;   
else   if(PrintMode==2)//橫向列印   
pDevMode->dmOrientation=DMORIENT_LANDSCAPE;       
::GlobalUnlock(m_hDevMode);   
}   





extern void DrawInfo(CDC &memDC, PRNINFO PrnInfo);


extern UINT m_nCxSelected ;


BOOL PrintSetup(HWND hParent, BOOL bDefault = FALSE);


BOOL Print(HWND hParent, LPCTSTR lpszDocName = "PrintListCtrl", BOOL bDefault = FALSE);


BOOL CPrintListCtrl::PrintSetup(HWND hParent, BOOL bDefault)
{
PRINTDLG stPD;

memset(&stPD, 0, sizeof(stPD));

stPD.lStructSize = sizeof(stPD);
stPD.hwndOwner   = hParent;
stPD.Flags       = PD_ALLPAGES | PD_DISABLEPRINTTOFILE |
PD_NOPAGENUMS | PD_NOSELECTION | PD_RETURNDC;
stPD.hDevNames   =  NULL;
stPD.hDevMode    = bDefault ? NULL : m_hDevMode;

if (bDefault)
{
stPD.Flags |= PD_RETURNDEFAULT;
}

BOOL bRet = PrintDlg(&stPD);

if (bRet == FALSE && CommDlgExtendedError()) return FALSE;

if (bRet == FALSE && !CommDlgExtendedError()) return TRUE;

ClearPrintDC();

m_hPrintDC = stPD.hDC;

return (m_hPrintDC != NULL);
}

第2篇

VC 獲取印表機與列印作業的狀態




#pragma comment(lib, "winspool.lib")
#include "stdafx.h"
#include <winspool.h>
#ifndef _MAX_PATH
#define _MAX_PATH 260
#endif
TCHAR m_tchPrinterMessage[_MAX_PATH];///< 列印結果的返回資訊


/// 獲取列印作業的狀態
BOOL GetJobs(HANDLE hPrinter,
JOB_INFO_2 **ppJobInfo,
int *pcJobs,           
DWORD *pStatus)        
{
DWORD       cByteNeeded, nReturned, cByteUsed;
JOB_INFO_2          *pJobStorage = NULL;
PRINTER_INFO_2       *pPrinterInfo = NULL;

if (!GetPrinter(hPrinter, 2, NULL, 0, &cByteNeeded))
{
DWORD dwErrorCode = ::GetLastError();
if (dwErrorCode != ERROR_INSUFFICIENT_BUFFER)
return FALSE;
}
pPrinterInfo = (PRINTER_INFO_2 *)malloc(cByteNeeded);
if (!(pPrinterInfo))
return FALSE;

if (!GetPrinter(hPrinter,
2,
(LPBYTE)pPrinterInfo,
cByteNeeded,
&cByteUsed))
{

free(pPrinterInfo);
pPrinterInfo = NULL;
return FALSE;
}

if (!EnumJobs(hPrinter,
0,
pPrinterInfo->cJobs,
2,
NULL,
0,
(LPDWORD)&cByteNeeded,
(LPDWORD)&nReturned))
{
if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)
{
free(pPrinterInfo);
pPrinterInfo = NULL;
return FALSE;
}
}
pJobStorage = (JOB_INFO_2 *)malloc(cByteNeeded);
if (!pJobStorage)
{

free(pPrinterInfo);
pPrinterInfo = NULL;
return FALSE;
}
ZeroMemory(pJobStorage, cByteNeeded);

if (!EnumJobs(hPrinter,
0,
pPrinterInfo->cJobs,
2,
(LPBYTE)pJobStorage,
cByteNeeded,
(LPDWORD)&cByteUsed,
(LPDWORD)&nReturned))
{
free(pPrinterInfo);
free(pJobStorage);
pJobStorage = NULL;
pPrinterInfo = NULL;
return FALSE;
}

*pcJobs = nReturned;
*pStatus = pPrinterInfo->Status;
*ppJobInfo = pJobStorage;
free(pPrinterInfo);
return TRUE;
}


/// 檢測印表機的狀態
/// hPrinter表示印表機Handle
BOOL CheckPrinterStatus(HANDLE hPrinter)
{
BOOL bResult = PRINT_NOT_EXIST;
if(NULL == hPrinter)
{
_tcscpy(m_tchPrinterMessage,_TEXT("印表機不存在!"));
return bResult;
}
bResult = PRINT_FALSE;
JOB_INFO_2  *pJobs;
int         cJobs,i;
DWORD       dwPrinterStatus;

if (!GetJobs(hPrinter, &pJobs, &cJobs, &dwPrinterStatus))
{
_tcscpy(m_tchPrinterMessage,_TEXT("列印失敗!"));
return bResult;
}
//
//if (dwPrinterStatus &
// (PRINTER_STATUS_ERROR |     //打印出錯
// PRINTER_STATUS_PAPER_JAM |        //卡紙
// PRINTER_STATUS_PAPER_OUT |
// PRINTER_STATUS_PAPER_PROBLEM |   //列印紙出現問題
// PRINTER_STATUS_OUTPUT_BIN_FULL |  //列印輸出已滿
// PRINTER_STATUS_NOT_AVAILABLE |   //印表機不可用
// PRINTER_STATUS_NO_TONER |    //沒有墨粉
// PRINTER_STATUS_OUT_OF_MEMORY |   //列印記憶體出錯
// PRINTER_STATUS_OFFLINE |    //未聯機
// PRINTER_STATUS_DOOR_OPEN))    //印表機的門是開的
//{
// free( pJobs );
// _tcscpy(m_tchPrinterMessage,_TEXT("打印出錯!"));
// return bResult;
//}
/// 正在列印
if(dwPrinterStatus & PRINTER_STATUS_PRINTING)
{
_tcscpy(m_tchPrinterMessage,_TEXT("正在列印..."));
bResult = PRINT_GOING;
}
else if(dwPrinterStatus & PRINTER_STATUS_PAUSED)
{
free( pJobs );
_tcscpy(m_tchPrinterMessage,_TEXT("列印暫停中..."));
return bResult;
}
else if(dwPrinterStatus & PRINTER_STATUS_BUSY)
{
free( pJobs );
_tcscpy(m_tchPrinterMessage,_TEXT("印表機繁忙,/n被臨時佔用"));
return bResult;
}
else if(dwPrinterStatus & PRINTER_STATUS_WAITING)
{
free( pJobs );
_tcscpy(m_tchPrinterMessage,_TEXT("列印等待中..."));
return bResult;
}
else if(dwPrinterStatus & PRINTER_STATUS_SERVER_OFFLINE)
{
free( pJobs );
_tcscpy(m_tchPrinterMessage,_TEXT("未連線印表機伺服器"));
return bResult;
}
else if(dwPrinterStatus & PRINTER_STATUS_ERROR)
{
free( pJobs );
_tcscpy(m_tchPrinterMessage,_TEXT("打印出錯!"));
return bResult;
}
else if(dwPrinterStatus & PRINTER_STATUS_PAPER_JAM)
{
free( pJobs );
_tcscpy(m_tchPrinterMessage,_TEXT("印表機卡紙"));
return bResult;
}
else if(dwPrinterStatus & PRINTER_STATUS_PAPER_OUT)
{
free( pJobs );
_tcscpy(m_tchPrinterMessage,_TEXT("列印紙位置不正確"));
return bResult;
}
else if(dwPrinterStatus & PRINTER_STATUS_PAPER_PROBLEM)
{
free( pJobs );
_tcscpy(m_tchPrinterMessage,_TEXT("列印紙出現問題"));
return bResult;
}
else if(dwPrinterStatus & PRINTER_STATUS_OUTPUT_BIN_FULL)
{
free( pJobs );
_tcscpy(m_tchPrinterMessage,_TEXT("列印輸出已滿"));
return bResult;
}
else if(dwPrinterStatus & PRINTER_STATUS_NOT_AVAILABLE)
{
free( pJobs );
_tcscpy(m_tchPrinterMessage,_TEXT("印表機不可用"));
return bResult;
}
else if(dwPrinterStatus & PRINTER_STATUS_TONER_LOW)
{
free( pJobs );
_tcscpy(m_tchPrinterMessage,_TEXT("印表機墨粉不足"));
return bResult;
}
else if(dwPrinterStatus & PRINTER_STATUS_NO_TONER)
{
free( pJobs );
_tcscpy(m_tchPrinterMessage,_TEXT("印表機沒有墨粉"));
return bResult;
}
else if(dwPrinterStatus & PRINTER_STATUS_OUT_OF_MEMORY)
{
free( pJobs );
_tcscpy(m_tchPrinterMessage,_TEXT("列印記憶體溢位"));
return bResult;
}
else if(dwPrinterStatus & PRINTER_STATUS_OFFLINE)
{
free( pJobs );
_tcscpy(m_tchPrinterMessage,_TEXT("無法連線印表機,\n可能是印表機未啟動"));
return bResult;
}
else if(dwPrinterStatus & PRINTER_STATUS_DOOR_OPEN)
{
free( pJobs );
_tcscpy(m_tchPrinterMessage,_TEXT("印表機的門是開著的,\n請關閉"));
return bResult;
}

for (i = 0; i < cJobs; ++i)
{
/// 如果列印頁正在列印
if (pJobs[i].Status & JOB_STATUS_PRINTING)
{
_tcscpy(m_tchPrinterMessage,_TEXT("正在列印..."));

if (pJobs[i].Status &
(JOB_STATUS_ERROR |
JOB_STATUS_OFFLINE |
JOB_STATUS_PAPEROUT |
JOB_STATUS_BLOCKED_DEVQ))
{
free( pJobs );
_tcscpy(m_tchPrinterMessage,_TEXT("打印出錯!"));
return bResult;
}
}
///// 如果列印頁已經列印或刪除
//if(pJobs[i].Status &
// (JOB_STATUS_PRINTED|
//  JOB_STATUS_DELETED))
//{
// free( pJobs );
// ::ClosePrinter(m_hPrintHandle);
// return PRINT_END;
//}
/// 如果列印頁已經列印
if(pJobs[i].Status & JOB_STATUS_PRINTED)
{
free( pJobs );
::ClosePrinter(m_hPrintHandle);
_tcscpy(m_tchPrinterMessage,_TEXT("列印成功!"));
bResult = PRINT_TRUE;
return bResult;
}
/// 如果已經刪除列印作業
else if(pJobs[i].Status & JOB_STATUS_DELETED)
{
free( pJobs );
::ClosePrinter(m_hPrintHandle);
_tcscpy(m_tchPrinterMessage,_TEXT("已取消列印"));
bResult = PRINT_TRUE;
return bResult;
}
else if(pJobs[i].Status & JOB_STATUS_PAUSED)
{
free( pJobs );
::ClosePrinter(m_hPrintHandle);
bResult = PRINT_FALSE;
_tcscpy(m_tchPrinterMessage,_TEXT("列印作業暫停..."));
return bResult;
}
else if(pJobs[i].Status & JOB_STATUS_ERROR)
{
free( pJobs );
::ClosePrinter(m_hPrintHandle);
bResult = PRINT_FALSE;
_tcscpy(m_tchPrinterMessage,_TEXT("列印作業出錯"));
return bResult;
}
else if(pJobs[i].Status & JOB_STATUS_SPOOLING)
{
free( pJobs );
::ClosePrinter(m_hPrintHandle);
bResult = PRINT_FALSE;
_tcscpy(m_tchPrinterMessage,_TEXT("列印作業離線"));
return bResult;
}
else if(pJobs[i].Status & JOB_STATUS_SPOOLING)
{
free( pJobs );
::ClosePrinter(m_hPrintHandle);
bResult = PRINT_FALSE;
_tcscpy(m_tchPrinterMessage,_TEXT("列印作業離線"));
return bResult;
}
else if(pJobs[i].Status & JOB_STATUS_OFFLINE)
{
free( pJobs );
::ClosePrinter(m_hPrintHandle);
bResult = PRINT_FALSE;
_tcscpy(m_tchPrinterMessage,_TEXT("列印作業未連線"));
return bResult;
}
else if(pJobs[i].Status & JOB_STATUS_PAPEROUT)
{
free( pJobs );
::ClosePrinter(m_hPrintHandle);
bResult = PRINT_FALSE;
_tcscpy(m_tchPrinterMessage,_TEXT("列印紙位置不正確"));
return bResult;
}
else if(pJobs[i].Status & JOB_STATUS_BLOCKED_DEVQ)
{
free( pJobs );
::ClosePrinter(m_hPrintHandle);
bResult = PRINT_FALSE;
_tcscpy(m_tchPrinterMessage,_TEXT("列印作業出錯"));
return bResult;
}
else if(pJobs[i].Status & JOB_STATUS_RESTART)
{
free( pJobs );
::ClosePrinter(m_hPrintHandle);
bResult = PRINT_FALSE;
_tcscpy(m_tchPrinterMessage,_TEXT("列印作業重新啟動"));
return bResult;
}
#if (NTDDI_VERSION >= NTDDI_WINXP)
else if(pJobs[i].Status & JOB_STATUS_COMPLETE)
{
free( pJobs );
::ClosePrinter(m_hPrintHandle);
bResult = PRINT_TRUE;
_tcscpy(m_tchPrinterMessage,_TEXT("列印完成"));
return bResult;
}
#endif // (NTDDI_VERSION >= NTDDI_WINXP)
 }
 /// 如果不存在列印任務
 if(0 == cJobs)
 {
free( pJobs );
_tcscpy(m_tchPrinterMessage,_TEXT("列印結束,\n當前無列印任務!"));
bResult = PRINT_TRUE;
return bResult;
 }
 
 free( pJobs );
 _tcscpy(m_tchPrinterMessage,_TEXT("列印成功!"));
 bResult = PRINT_TRUE;
 return bResult;
}

關於 印表機的一些操作函式和疑問:

根據印表機的名稱可以開啟印表機,並且獲取印表機的名稱。
OpenPrinter
The OpenPrinter function retrieves a handle identifying the specified printer or print server. 

BOOL OpenPrinter(
  LPTSTR pPrinterName, // pointer to printer or server name
  LPHANDLE phPrinter,  // pointer to printer or server handle
  LPPRINTER_DEFAULTS pDefault 
                       // pointer to printer defaults structure
);

GetPrinter
The GetPrinter function retrieves information about a specified printer. 
BOOL GetPrinter(
  HANDLE hPrinter,    // handle to printer of interest
  DWORD Level,        // version of printer info data structure
  LPBYTE pPrinter,    // pointer to array of bytes that receives 
                      // printer info structure
  DWORD cbBuf,        // size, in bytes, of the pPrinter buffer
  LPDWORD pcbNeeded   // pointer to variable with count of bytes 
                      // retrieved (or required)
);

但是操作過上面的兩個函式後該怎麼使用印表機呢?

關閉印表機
ClosePrinter
The ClosePrinter function closes the specified printer object. 

BOOL ClosePrinter(
  HANDLE hPrinter   // handle to printer object
);

相關推薦

VC印表機程式設計有用文章獲取印表機列印作業狀態設定印表機模式列印

VC印表機程式設計之兩篇有用的文章 vc設定印表機模式並預覽列印   呼叫列印屬性對話方塊: if(::OpenPrinter("Adobe PDF", &hPrint, NULL)) {::PrinterProperties(m_hWnd, hPrint);::

第36天併發程式設計程序

目錄:   1. 基礎概念   2. 建立程序和結束程序   3. 程序之間記憶體空間物理隔離   4. 程序的屬性方法   5. 守護程序   6. 互斥鎖   7. IPC通訊機制   8. 生產者消費者模型 一. 基礎概念 1. 什麼叫做程式,什麼叫做程序?

Windows程式設計程序

    Windows系統中,程序是一個很重要的部分,程序與程序核心物件對應,同時也擁有許多屬性,我們必須一一地去熟悉他們,從而來感知系統。 程序屬性                 &n

Python學習【第24】:死鎖,遞迴鎖,訊號量,Event事件,執行緒Queue python併發程式設計多執行緒2------------死鎖遞迴鎖,訊號量等

python併發程式設計之多執行緒2------------死鎖與遞迴鎖,訊號量等 一、死鎖現象與遞迴鎖 程序也是有死鎖的 所謂死鎖: 是指兩個或兩個以上

Java 多執行緒程式設計個執行緒實現一個執行緒列印奇數,另一個執行緒列印偶數”

題目:t從0到N,一個執行緒列印奇數,一個執行緒列印偶數,按順序打印出來。            最終列印結果:0,1,2,3,4,...,N;            思路:兩個執行緒間的通訊採用等待,喚醒方法——列印奇偶數由flag控制,當flag為真時列印偶數; 列

samba 4.0.7 devel 程式設計配置

/*************util/talloc_stack.h***************************/ /*  * Create a new talloc stack frame.  * 記憶體分配  * When free'd, it frees all stack frames tha

084_《Windows網路程式設計Delphi

《Windows網路程式設計之Delphi篇》 Delphi 教程系列書籍 (084) 《Windows網路程式設計之Delphi篇》網友(邦)整理 EMail: [email protected] 下載地址: Part1 Part2 Part3 作者: 蕭秋水

Java併發程式設計執行緒生命週期、守護執行緒、優先順序join、sleep、yield

Java併發程式設計中,其中一個難點是對執行緒生命週期的理解,和多種執行緒控制方法、執行緒溝通方法的靈活運用。這些方法和概念之間彼此聯絡緊密,共同構成了Java併發程式設計基石之一。 Java執行緒的生命週期 Java執行緒類定義了New、Runnable、Running Man、Blocked和Dead

【181129】VC++ GDI+程式設計必備的原始碼庫_各種繪圖影象處理函式原始碼

VC++ GDI+程式設計必備的原始碼庫,包含GDI+各個方面的程式設計示例。 以下是各種功能列表: 畫筆 從畫刷中構造畫筆 自定義線型 畫筆的對齊方式 畫筆的縮放與旋轉 畫筆的線帽屬性 畫筆的透明度支援

最近Nature子刊的經驗教訓

應一些朋友要求,寫寫自己最近兩篇文章(一篇article,一篇letter)的一些感想和教訓,算是對前期工作的一個總結。首先報簡歷:04-08(本科),08-至今 (研究生),土博一個,暫時還沒出過國門。介紹一下兩個子刊Nature Geoscience和Nature Co

GSM Sniffing入門軟體:GSMTAP抓取SMS(Short Message Service)

From:http://www.cnblogs.com/k1two2/p/4539681.html 重點介紹如何利用50元左右的裝置,抓包並還原SMS簡訊內容: ps:研究GSM Sniffing純屬個人興趣,能抓SMS報文只是撿了個明文傳輸的漏子,切勿用於非法用途。就

自定義控制元件三部曲繪圖(十三)——Canvas圖層(一)

前言:猛然知道姥姥79了,我好怕,好想哭系列文章:一、如何獲得一個Canvas物件方法一:自定義view時, 重寫onDraw、dispatchDraw方法(1)、定義 我們先來看一下onDraw、dispatchDraw方法的定義protected void onDraw(

每天一點兒JAVA陣列--一維和多維陣列的初始化基本操作

<span style="font-family: Arial, Helvetica, sans-serif;"> * <p>Description: 演示一維陣列和多維陣列的初始化和基本操作</p></span> * <

Unity3D熱更新LuaFramework[09]--資源熱更新程式碼熱更新的具體實現

前言 在上一篇文章 Unity3D熱更新之LuaFramework篇[08]--熱更新原理及熱更伺服器搭建 中,我介紹了熱更新的基本原理,並且著手搭建一臺伺服器。 本篇就做一個實戰練習,真正的來實現熱更新功能。 一、準備工作 1、製作一個用於熱更新的介面 此前我製作了

[js高手路]深入淺出webpack系列1-安裝基本打包用法命令參數

查看 2-2 gre colors 令行 一起 切換 json round webpack,我想大家應該都知道或者聽過,Webpack是前端一個工具,可以讓各個模塊進行加載,預處理,再進行打包。現代的前端開發很多環境都依賴webpack構建,比如vue官方就推薦使用webp

mysql 開發進階系列 43 邏輯備份恢復(基於時間位置的不完全恢復)

一. 概述          在上篇講到了邏輯備份,使用mysqldump工具來備份一個庫,並使用完全恢復還原了資料庫。在結尾也講到了誤操作是不能用完全恢復的。解決辦法是:我們需要恢復到誤操作之前的狀態,然後跳過誤操作語句。再恢復後面執行的語句,完成我們的恢復,這種恢復叫“不完全恢復”。在mysql 中,不完

Qt總結三:磁碟檔案操作、遍歷資料夾檔案目錄,過濾獲取檔案資訊、字尾名、字首名(三)

前言 本節內容主要包括磁碟容量檢測、磁碟內指定或特定檔案的操作 話不多說,先上效果圖 共分為兩個部分,第一部分是檢測磁碟容量,第二部分是篩選磁碟內指定檔案(test.txt)或特定檔案(.txt / .png型別檔案) 獲取磁碟容量關鍵函式:【fileapi.h】 

Python 網路爬蟲 009 (程式設計) 通過正則表示式來獲取一個網頁中的所有的URL連結,下載這些URL連結的原始碼

通過 正則表示式 來獲取一個網頁中的所有的 URL連結,並下載這些 URL連結 的原始碼 使用的系統:Windows 10 64位 Python 語言版本:Python 2.7.10 V 使用的程式設計 Python 的整合開發環境:PyCharm 201

膝蓋中了一箭康復-周年紀念

選擇 教練 小時 自由 過程 美好 正常 月份 com 右膝蓋前十字韌帶在2014年12月份的一次踢球中不小心弄斷。2015年5月份才確診。2015年的7月1日做了十字韌帶重建術。到現在剛好是術後兩年。 術後一年的紀念文章在這裏:膝蓋中了一箭之康復篇-一周年紀念。

Python3 C# 網路程式設計~ 網路基礎

最新版本檢視:https://www.cnblogs.com/dotnetcrazy/p/9919202.html 入門篇 官方文件:https://docs.python.org/3/library/ipc.html(程序間通訊和網路) 例項程式碼:https://github.com/lotapp/