[CB] Print버튼누르면 인쇄.(Unhook())
Opened this issue · 17 comments
jongwuner commented
CB상에서 인쇄
호출과정 : Server-Service -> InterruptLogin -> CB
Server-service에서 하는게 제일깔끔하긴 한데..
jongwuner commented
사전에 TotalPage수 모두 파악
- WMI에 TotalPage
- PDF로 StartPagePrinter 후 실제 Print
- PrintTicket ?
jongwuner commented
CB상에서 인쇄,
- CB Socket이용해서 Data받아온다.
if( >=0 ) unhook()
jongwuner commented
CB Socket에서 로직을 조금 추가해야 겠다.
- loop 형태도 만들고, if(잔여 프린트물)
- 지금 현재 마일리지 값을 서버로 전송/수신 해주고,
jongwuner commented
사용하지 않고 있는 PrinterSocket을 여기서 사용하면 될듯 하다.
- MyService : Hook 코드 안에
PrinterSocket.Receive()
으로 대기 - CB : Print ->
PrinterSocket.Send()
그러면 CB상에서 Socket 2개 필요한가?
- CB자체 소켓.
- PrinterSocket 송신용 소켓.
jongwuner commented
마일리지가 부족할 경우, Print를 아예 취소할 수도 있어야 한다.
jongwuner commented
PrintController.Receive();
<--- Socket을 통한 대기
if(pk.IsPrint == true)
----잔액확인--->Unhook();
- `else printJob.Cancle(); <----잔액없을 경우 || 2분이 초과된 경우
- 신호가 장시간 동안 오지 않는 경우 ---> Socket에 2분정도의 시간제한을 걸어야겠다.
-> Thread.Sleep() 을 통한 Count로 break문 걸면 된다.
jongwuner commented
PrinterServer (.NET)
- Network Server
- Local Server
jongwuner commented
- Service에서 PrintSocket 대기
- Hooking 함수에서 Receive
- WaitForSingleObject()
- Bit 주는 방식
jongwuner commented
jongwuner commented
To-do 정리
- Real PrintCnt 를 언제 넘겨주어야 하는지? ------>
후불제
- Real PrintCnt 를 실셈하는 모듈 구현해보기? ---->
후불제
- PrintJob.Cancle 모듈 구현하기
- 로그인창이 중도에 끊겼을때, 어떻게 처리할 것인가?
- Return Value 를 이용할 것인가?
- Timer을 이용할 것인가?
-> Thread.Sleep(1000) 을 통한 Cnt++
jongwuner commented
후불제를 했을 때 생기는 문제점
- 지금 현재 UI의 구성을 바꿔야 한다. ------> 이것을 바꾸면 너무 조잡해지지 않나 싶다.
- DB업데이트를 서버자체에서 해줘야한다. -----> 이정도는 수정 가능.
private void ExecutePrint(object obj)
{
if (System.Windows.Forms.MessageBox.Show("출력할 인쇄물이 남았습니까?", "TYPRESS Print", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
{
System.Windows.Forms.MessageBox.Show("출력을 진행합니다.");
App.PrintSocketConnect();
UpdateDB();
dp.Opt = 1; // 소켓 종료 메세지
App.SendPacketToServer(dp);
dp.Opt = 0;
pp.IsPrinted = true;
App.SendPrintPacketToServer(pp);
pp.IsPrinted = false;
System.Environment.Exit(0);
}
else
{
App.SendPacketToServer(new DataPacket());
System.Windows.Forms.MessageBox.Show("로그아웃");
ViewHandler.OpenLoginViewFromMain();
System.Environment.Exit(1);
}
}
jongwuner commented
jongwuner commented
ThreadHandler.PrintedOpt
- 일단 Monitor는 별도의 스레드로 진행이 된다.
- Monitor Thread : AddJob을 잡아내고나서, 거기에서
ThreadHandler.PrintedOpt
의 값을 기다리며(Timer), Cancle시키는지, Pass하는지(그대로 Print를 하는지)를 기다림.
- Print를 클릭했는지 ----> 잔액이 남아있는지 -----> 남아있다면
Pass
-----> 잔액이 없다면Cancle()
- Cancle을 클릭했는지 ------------------------------->
Cancle()
- 시간초과, 오류로 연결끊어짐 등 ------------------->
Cancle()
jongwuner commented
jongwuner commented
Cancle 시, Hooking 함수에서 WaitOne을 해결해주어야 함.
- Cancle시 무한루프 발생
- DataPacket에서
bool IsPrinted;
를 Int형으로 변환해서 선택지를 늘려야할 듯 하다. Cancle
및마일리지 부족
의 경우에 PrintSocket쪽에 패킷을 전달해주어야 한다.
DvPrinter.Monitor
- 이 쪽에서 반응을 안한다는 뜻
- Monitor에서 잡히긴 하는데, if문에 걸리지가 않음.
if (bJobRelatedChange == ((pdwChange & PRINTER_CHANGES.PRINTER_CHANGE_ADD_JOB) == PRINTER_CHANGES.PRINTER_CHANGE_ADD_JOB))
{
int ThreadTimer = 0;
while (ThreadHandler.PrintedOpt == (int)PRINTOPT.PRINT_OPT_LISTEN && ThreadTimer <= 60)
{
Thread.Sleep(1000);
ThreadTimer++;
}
if(ThreadHandler.PrintedOpt == (int)PRINTOPT.PRINT_OPT_CANCLE || ThreadTimer >= 60) pji.Cancel();
ThreadHandler.PrintedOpt = (int)PRINTOPT.PRINT_OPT_LISTEN;
}
public class PRINTER_CHANGES
{
public const uint PRINTER_CHANGE_ADD_PRINTER = 1;
public const uint PRINTER_CHANGE_SET_PRINTER = 2;
public const uint PRINTER_CHANGE_DELETE_PRINTER = 4;
public const uint PRINTER_CHANGE_FAILED_CONNECTION_PRINTER = 8;
public const uint PRINTER_CHANGE_PRINTER = 0xFF;
public const uint PRINTER_CHANGE_ADD_JOB = 0x100;
public const uint PRINTER_CHANGE_SET_JOB = 0x200;
public const uint PRINTER_CHANGE_DELETE_JOB = 0x400;
public const uint PRINTER_CHANGE_WRITE_JOB = 0x800;
public const uint PRINTER_CHANGE_JOB = 0xFF00;
public const uint PRINTER_CHANGE_ADD_FORM = 0x10000;
public const uint PRINTER_CHANGE_SET_FORM = 0x20000;
public const uint PRINTER_CHANGE_DELETE_FORM = 0x40000;
public const uint PRINTER_CHANGE_FORM = 0x70000;
public const uint PRINTER_CHANGE_ADD_PORT = 0x100000;
public const uint PRINTER_CHANGE_CONFIGURE_PORT = 0x200000;
public const uint PRINTER_CHANGE_DELETE_PORT = 0x400000;
public const uint PRINTER_CHANGE_PORT = 0x700000;
public const uint PRINTER_CHANGE_ADD_PRINT_PROCESSOR = 0x1000000;
public const uint PRINTER_CHANGE_DELETE_PRINT_PROCESSOR = 0x4000000;
public const uint PRINTER_CHANGE_PRINT_PROCESSOR = 0x7000000;
public const uint PRINTER_CHANGE_ADD_PRINTER_DRIVER = 0x10000000;
public const uint PRINTER_CHANGE_SET_PRINTER_DRIVER = 0x20000000;
public const uint PRINTER_CHANGE_DELETE_PRINTER_DRIVER = 0x40000000;
public const uint PRINTER_CHANGE_PRINTER_DRIVER = 0x70000000;
public const uint PRINTER_CHANGE_TIMEOUT = 0x80000000;
public const uint PRINTER_CHANGE_ALL = 0x7777FFFF;
}
- Cancle 버튼만 눌렀을때, back-end랑 front-end랑 잘 안맞는 부분이 있는 것 같다.
- 한글 무한루프