我正在使用gRPC从客户端与服务器进行通信。我正在使用Asynchronous Greeter示例。我希望服务器在客户端向服务器发送消息时创建PDF文件。我有一个名为makefile()的函数,它将创建pdf文件。我目前在Proceed()函数中调用它。这是一个叫它的好地方吗?我的代码大部分都适用,但有时当我将消息发送到服务器时,服务器不会生成文件。例如,如果我尝试10次,则服务器可能只生成8个文件。它应该是10.还可以将makefile()函数放在一个线程中吗?我添加了makefile()代码。我正在使用Libharu pdf lib。
void Proceed() {
if (status_ == CREATE) {
// As part of the initial CREATE state, we *request* that the system
// start processing SayHello requests. In this request, "this" acts are
// the tag uniquely identifying the request (so that different CallData
// instances can serve different requests concurrently), in this case
// the memory address of this CallData instance.
service_->RequestSayHello(&ctx_, &request_, &responder_, cq_, cq_,
status_ = PROCESS;
} else if (status_ == PROCESS) {
new CallData(service_, cq_);
// The actual processing.
std::string prefix("Hello ");
makefile() // function to make pdf file
reply_.set_message(prefix + request_.name());
.
responder_.Finish(reply_, Status::OK, this);
status_ = FINISH;
} else {
GPR_ASSERT(status_ == FINISH);
delete this;
}
}
}
makefile()
{
const char *page_title = "Font Demo";
HPDF_Doc pdf;
char fname[256];
HPDF_Page page;
HPDF_Font def_font;
HPDF_REAL tw;
HPDF_REAL height;
HPDF_REAL width;
HPDF_UINT i;
strcpy (fname, argv[0]);
strcat (fname, ".pdf");
pdf = HPDF_New (error_handler, NULL);
if (!pdf) {
printf ("error: cannot create PdfDoc object\n");
return 1;
}
if (setjmp(env)) {
HPDF_Free (pdf);
return 1;
}
/* Add a new page object. */
page = HPDF_AddPage (pdf);
height = HPDF_Page_GetHeight (page);
width = HPDF_Page_GetWidth (page);
/* Print the lines of the page. */
HPDF_Page_SetLineWidth (page, 1);
HPDF_Page_Rectangle (page, 50, 50, width - 100, height - 110);
HPDF_Page_Stroke (page);
/* Print the title of the page (with positioning center). */
def_font = HPDF_GetFont (pdf, "Helvetica", NULL);
HPDF_Page_SetFontAndSize (page, def_font, 24);
tw = HPDF_Page_TextWidth (page, page_title);
HPDF_Page_BeginText (page);
HPDF_Page_TextOut (page, (width - tw) / 2, height - 50, page_title);
HPDF_Page_EndText (page);
/* output subtitle. */
HPDF_Page_BeginText (page);
HPDF_Page_SetFontAndSize (page, def_font, 16);
HPDF_Page_TextOut (page, 60, height - 80, "<Standerd Type1 fonts samples>");
HPDF_Page_EndText (page);
HPDF_Page_BeginText (page);
HPDF_Page_MoveTextPos (page, 60, height - 105);
i = 0;
while (font_list[i]) {
const char* samp_text = "abcdefgABCDEFG12345!#$%&+-@?";
HPDF_Font font = HPDF_GetFont (pdf, font_list[i], NULL);
/* print a label of text */
HPDF_Page_SetFontAndSize (page, def_font, 9);
HPDF_Page_ShowText (page, font_list[i]);
HPDF_Page_MoveTextPos (page, 0, -18);
/* print a sample text. */
HPDF_Page_SetFontAndSize (page, font, 20);
HPDF_Page_ShowText (page, samp_text);
HPDF_Page_MoveTextPos (page, 0, -20);
i++;
}
HPDF_Page_EndText (page);
HPDF_SaveToFile (pdf, fname);
/* clean up */
HPDF_Free (pdf);
}