小编Tre*_*son的帖子

使用RabbitMQ Queue时等待NodeJS中的异步任务

在 node.js 中使用 amqp-lib (7) 我在从 RabbitMQ 队列中消费时无法等待异步任务。

例如,

    channel.consume(exchange_name, doWork, {
        noAck: false
    });

    function doWork(msg) {
        log.info(JSON.parse(msg.content.toString()));
        setTimeout(function () {
            log.info("   Done");
            channel.ack(msg);
        }, 2000);
    }
Run Code Online (Sandbox Code Playgroud)

这应该,AFAIK 从队列中检索消息,处理它,然后确认该过程已完成并成功。

但是,当我运行它与包含 1000 条消息的队列时,它将抓取所有 1000 条消息并启动该过程。然后 2 秒后,确认一切都已完成。

是否可以等待该过程完成并获得下一个?(在等待另一个进程时,工作人员不应消耗成千上万条消息中的 10 条)。

提前致谢

amqp rabbitmq node.js

5
推荐指数
0
解决办法
2070
查看次数

等待很长时间,仍在更新用户界面

我一直在尝试创建一个写入数据库的任务,而不会阻塞UI线程。我遇到的最大问题是等待该过程完成而不会发生阻塞。

我一直在尝试避免使用DoEvents(尽管此程序现在经常使用它,但我希望在前进时不再使用它)。

我试图创建要在第二个线程上运行的进程,并等待它完成以及使用BackgroundWorker

我遇到的问题不是让代码在其他线程中运行,而是试图找到一种方法来等待它完成。

基本上,现在我要执行以下操作:

  1. 连接到数据库
  2. 创建一个后台工作程序(或线程)来写数据库(我可能最终会写成,BackgroundWorker所以我可以使用ReportProgress
  3. 启动线程或 BackgroundWorker
  4. 使用While循环等待线程/ BackgroundWorker完成。对于线程,我等待IsAlive变为false,对于BackgroundWorker,我切换一个布尔变量。
  5. 我让用户知道该过程已完成。

问题出在#4中。

在没有代码的情况下执行while循环,或者Thread.Sleep(0)阻塞UI(Thread.Sleep(0)使程序也占用程序资源的100%)

所以我做:

while (!thread.IsAlive)
   Thread.Sleep(1);
Run Code Online (Sandbox Code Playgroud)

-要么-

while (bProcessIsRunning)
   Thread.Sleep(1);
Run Code Online (Sandbox Code Playgroud)

这会阻塞用户界面。

如果在此调用Application.DoEvents(),则UI会更新(尽管它是可单击的,所以在此过程运行时,我必须禁用整个表单)。

如果我同步运行该过程,那么我仍然需要创建某种方式来更新UI(在我看来,是一个DoEvents调用),这样它就不会被锁定。

我究竟做错了什么?

.net c# multithreading doevents winforms

3
推荐指数
1
解决办法
1万
查看次数

函数在C++中连接两个char*

首先,我是一名C#程序员,所以我对C++的工作知识相当有限.我在大学时把它拿回来了,但是在10年内没有碰到它,所以如果这是相对简单的东西,请原谅我.

我正在尝试创建一个可以在C#中使用的DLL,它实现了libwpd库.

我已经设法创建了一个DLL,它可以导出我可以通过P/Invoke访问的2个函数.第一个返回一个常量整数(由visual studio作为样本生成),第二个返回一个字符串.

如果我从函数返回一个常量字符串,它会成功传递给C#,我可以在另一端读取它,所以我知道数据正在被传回.

我遇到的问题是libwpd.我不得不修改他们的TextDocumentGenerator.cpp文件,将信息添加到char*而不是使用他们使用的printf,以便我以后可以访问它.

我已经在头文件的公共部分添加了一个变量定义,所以我可以从调用代码中读取它.

现在,我正在尝试编写一个函数,允许我将libwpd给出的char*添加到外部char*.

我想出来了:

char* addString(const char* addThis, char* toThis)
{
char* copier  = (char*)malloc(strlen(toThis) + 1 + 1);
strcpy(copier, toThis);
strcpy(copier, "1");

toThis = (char*)malloc(strlen(copier) + 1);
strcpy(toThis, copier);

return copier;
} 
Run Code Online (Sandbox Code Playgroud)

但当我传回信息时,我得到一个空白字符串.

我通过调用来调用该函数 totalFile = addString("\n", totalFile);

(我意识到它应该只在技术上反复地向字符串添加"1",但它甚至没有做到)

如果我将strcpy更改为复印机线的strcat,它会锁定.

我不知道如何用C++创建程序,所以我甚至可以通过这些函数来查看正在发生的事情.

任何援助将不胜感激.

c++ dll strcat visual-studio-2008

2
推荐指数
1
解决办法
6651
查看次数