小编dso*_*ano的帖子

开放线程安全吗?

两个线程同时调用open()可以吗?如何找到这个问题的答案?

假定调用不同的文件上进行操作,他们的标志可以O_RDONLY,O_WRONLY或者两者兼而有之.

c libc thread-safety

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

在Linux中使用Qt关闭()filedescriptor

背景资料:

我一直在编写代码来控制通过USB线连接的设备,但是模拟RS-232串口.

有问题的设备是Arduino微控制器控制的伺服摇摄和倾斜阶段(但这并不重要).

我已经设法使用C++语言将字符写入USB模拟串行端口,并使用以下代码在NetBeans IDE中设置g ++编译器:

    #include <cstdlib>
    #include <stdio.h>   /* Standard input/output definitions */
    #include <string.h>  /* String function definitions */
    #include <unistd.h>  /* UNIX standard function definitions */
    #include <fcntl.h>   /* File control definitions */
    #include <errno.h>   /* Error number definitions */
    #include <termios.h> /* POSIX terminal control definitions */

    /*
     * 'open_port()' - Open serial port 1.
     *
     * Returns the file descriptor on success or -1 on error.
     */

    int
    open_port(void)
    {
        int fd; /* …
Run Code Online (Sandbox Code Playgroud)

c++ linux qt serial-port arduino

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

Arduino中的一个类中的Serial.println

我正在尝试Serial.println()在Arduino IDE中的一个类中进行.但是,编译器说Serial这个范围没有声明.这是代码:

Menu.h中的代码

class Menu
{
    public:
        int options[4];

        void test() {
          Serial.println("here");
        }

    private:

};
Run Code Online (Sandbox Code Playgroud)

主文件中的代码:

#include "Menu.h"

Menu menu;

void setup() {
    Serial.begin(9600);
    menu.test();
}

void loop() {
}
Run Code Online (Sandbox Code Playgroud)

c++ serial-port class arduino

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

使用python twisted框架连接到多个串行套接字

我目前使用twisted来连接到我拥有的串行设备,使用如下代码.

from twisted.internet import reactor
SerialPort(Handler(), "/dev/ttyACM1", reactor, baudrate='9600')
reactor.run()
Run Code Online (Sandbox Code Playgroud)

但是,我知道需要扩展应用程序以监视添加(和删除)的新串行设备.我目前使用pyinotify来寻找添加/删除的新设备,这看起来效果很好.

class EventHandler(pyinotify.ProcessEvent):
    def process_IN_CREATE(self, event):
        ... connect to serial device
        ...
Run Code Online (Sandbox Code Playgroud)

目前我似乎有几个问题.我认为最大的问题是我对Twisted知之甚少,不知道这样做的"正确"方法是什么.

目前正如我所知,pyinotify事件处理程序在一个单独的线程中启动,这意味着反应堆没有在主线程中运行.这是一个问题吗?

连接第一个设备后,我很难添加第二个设备 - 尤其是在第二个设备添加时,反应堆已经在运行.即使我用一个保护它

if not reactor.running: 
Run Code Online (Sandbox Code Playgroud)

第二个连接没有正确添加到反应器(至少connectionMade,dataReceived接收方法不会触发).

如果我首先启动反应器,然后让pyinotify事件尝试并添加到正在运行的反应器,这似乎也不起作用 - 设备连接,但dataReceived方法永远不会被调用.

基本上,我确信有一个简洁的方法让这个工作,我只是无法通过谷歌或反复试验找到它.任何人都可以向我建议我如何才能使这个工作?

提前感谢您提供的任何帮助,

西蒙

python serial-port twisted

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

线程安全的Python属性/属性?

我有以下代码:

class SomeSharedData(object):
    def __init__(self):
        self._lock = RLock()
        self._errors = 0

    @property
    def errors(self):
        with self._lock:
        return self._errors

    @errors.setter
    def errors(self, value):
        with self._lock:
            self._errors = value
Run Code Online (Sandbox Code Playgroud)

除了更多的属性,如errors.我的目标是易用性,而不是效率,所以过度锁定很好.

是否有更简洁的方法来定义这些属性?

到目前为止我提出的最好的是:

class thread_safe_property(object):
    def __init__(self, name=None):
        self.name = name

    def __get__(self, obj, objtype):
        with obj._lock:
            return getattr(obj, self.name)

    def __set__(self, obj, val):
        with obj._lock:
            setattr(obj, self.name, val)

class SomeSharedData(object):
    def __init__(self):
        self._lock = RLock()
        self._errors = 0

    errors = thread_safe_property('_errors')
Run Code Online (Sandbox Code Playgroud)

想法?更好的方法?

原始代码和新方法都会遇到类似语句的可能竞争条件data.errors += 1,但我很少需要执行这些操作,因此我在需要时添加了变通方法.

谢谢!

python attributes properties thread-safety

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

支持删除项目的线程安全集合

我似乎无法找到支持简单的Remove()函数的.NET线程安全/并发集合,我可以在其中删除特定项目或传入谓词以根据该项目删除项目.我试过了:

BlockingCollection<T>
ConcurrentQueue<T>
ConcurrentStack<T>
ConcurrentBag<T>
Run Code Online (Sandbox Code Playgroud)

有没有人知道支持这种行为的集合,还是我必须自己创建?

我希望能够从线程安全队列中获取下一个项目而不删除它,稍后如果满足某个条件,则继续删除它.

c# collections concurrency thread-safety concurrent-programming

3
推荐指数
2
解决办法
5271
查看次数

如何在Python中从整数创建字节值?

背景:我需要将一个数值作为字节发送到外部设备,但我遇到了一个问题.我的代码是:

ser=serial.Serial("COM3",9600, timeout=0)
ser.write(value)
Run Code Online (Sandbox Code Playgroud)

其中"value"是我读过的int读过的.问题是,当我发送它时,它发送字符值,而不是实际值(它发送数字5的字节值31,因为这是它的unicode位置,我相信)

实际上,我希望能够以"\ x05"字符发送它.我想我的问题是,我将如何将int 5转换为char"\ x05",或将37转换为"\ x37"

python serial-port arduino pyserial

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

如何使用 COMMTIMEOUTS 等待字节可用但读取多个字节?

我有一个 C++ 串行端口类,它具有无阻塞和用于读取操作的阻塞模式。对于阻塞模式:

COMMTIMEOUTS cto;
GetCommTimeouts(m_hFile,&cto);
// Set the new timeouts
cto.ReadIntervalTimeout = 0;
cto.ReadTotalTimeoutConstant = 0;
cto.ReadTotalTimeoutMultiplier = 0;
SetCommTimeouts(m_hFile,&cto)
Run Code Online (Sandbox Code Playgroud)

对于非阻塞模式:

COMMTIMEOUTS cto;
GetCommTimeouts(m_hFile,&cto);
// Set the new timeouts
cto.ReadIntervalTimeout = MAXDWORD;
cto.ReadTotalTimeoutConstant = 0;
cto.ReadTotalTimeoutMultiplier = 0;
SetCommTimeouts(m_hFile,&cto)
Run Code Online (Sandbox Code Playgroud)

我想添加另一种等待任意数量字节并读取它们的模式。

从 MSDN COMMTIMEOUTS 结构

如果应用程序将ReadIntervalTimeoutReadTotalTimeoutMultiplier 设置MAXDWORD并将ReadTotalTimeoutConstant设置为大于零且小于MAXDWORD 的值,则在调用 ReadFile 函数时会发生以下情况之一:

  • 如果输入缓冲区中有任何字节,ReadFile 会立即返回缓冲区中的字节。
  • 如果输入缓冲区中没有字节,ReadFile 会等待一个字节到达,然后立即返回。
  • 如果在 ReadTotalTimeoutConstant 指定的时间内没有字节到达,则 ReadFile 超时。

这看起来像这样的代码:

COMMTIMEOUTS cto;
GetCommTimeouts(m_hFile,&cto);
// Set the new timeouts
cto.ReadIntervalTimeout …
Run Code Online (Sandbox Code Playgroud)

c++ winapi serial-port communication

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

关于同一来源的中断的事情

有人说

当PIC发送中断时,PIC将不会从同一源发送另一个中断,直到通过I/O端口确认.这是因为中断处理程序通常操纵关键数据结构,并且不会经受新自身调用的中断(即它们不是可重入的).

我不明白.同一来源和不同来源的中断之间有什么不同吗?

linux kernel interrupt linux-kernel

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

Window Service - 等待存储过程获取结果

我正在从 Window Service 运行存储过程C#。存储过程是一个相当繁重的查询,并且需要相当长的时间。

我想等到存储过程完成并返回值。

有什么方法可以确定存储过程已完成吗?

c# windows-services sql-server-2005 sql-server-2008 c#-4.0

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