新的C++有这个std :: thread类型.奇迹般有效.现在我想给每个线程一个名称以便更容易调试(比如java允许你).使用pthreads我会这样做:
pthread_setname_np(pthread_self(), "thread_name");
Run Code Online (Sandbox Code Playgroud)
但我怎么能用c ++ 0x做到这一点?我知道它在Linux系统下使用pthreads,但我想让我的应用程序可移植.有可能吗?
我正在尝试编写一个C++程序(尽管如果有人知道更好的(IAX/SIP)替代方案,那么连接到Asterisk服务器也会很好).
连接后,它应该听取音频和处理.它还应该发回音频.我正在使用https://sourceforge.net/projects/iaxclient/(注意有几个版本(beta版,常规版,svn版),它们的行为都不同).
现在,如果我理解了库的代码是正确的,那么它可以使用事件调用回调函数.其中一个事件是IAXC_EVENT_AUDIO.在那个IAXC_EVENT_AUDIO的结构中有一个方向; 传出来的.这就是我迷失的地方:对于某些版本的iaxclient,我只接收IAXC_SOURCE_REMOTE消息,其中包含两者.如果我切换到测试模式(应该只禁用音频设备),我通常什么也得不到.当我收到这两个IAXC_SOURCE_LOCAL和IAXC_SOURCE_REMOTE,我试图设置这些事件随机数据的缓冲器,但在所有的(我把它设置为RAW模式),不到达另一端.
任何人都有任何建议如何解决这个问题?
我的测试代码是:
#include <iaxclient.h>
#include <unistd.h>
int iaxc_event_callback(iaxc_event e)
{
if (e.type == IAXC_EVENT_TEXT) {
printf("text\n");
}
else if (e.type == IAXC_EVENT_LEVELS) {
printf("level\n");
}
else if (e.type == IAXC_EVENT_STATE) {
struct iaxc_ev_call_state *st = iaxc_get_event_state(&e);
printf("\tcallno %d state %d format %d remote %s(%s)\n", st->callNo, st->state, st->format,st->remote, st->remote_name);
iaxc_key_radio(st->callNo);
}
else if (e.type == IAXC_EVENT_NETSTAT) {
printf("\tcallno %d rtt %d\n", e.ev.netstats.callNo, e.ev.netstats.rtt);
}
else if (e.type == IAXC_EVENT_AUDIO) {
printf("\t AUDIO!!!! %d %u %d\n", …Run Code Online (Sandbox Code Playgroud) 在处理多个千兆字节的文件时,我注意到一些奇怪的事情:似乎从使用filechannel的文件读取到使用allocateDirect分配的重用ByteBuffer对象比从MappedByteBuffer读取要慢得多,实际上它甚至比读取字节更慢 - 使用常规读取调用的数组!
我期望它(几乎)与从mappedbytebuffers读取一样快,因为我的ByteBuffer被分配了allocateDirect,因此读取应该直接在我的bytebuffer中结束而没有任何中间副本.
我现在的问题是:我做错了什么?或者bytebuffer + filechannel是否比常规io/mmap慢?
我在下面的示例代码中还添加了一些代码,将读取的内容转换为long值,因为这是我的实际代码不断执行的操作.我希望ByteBuffer getLong()方法比我自己的字节shuffeler快得多.
测试结果:mmap:3.828 bytebuffer:55.097常规i/o:38.175
import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.channels.FileChannel.MapMode;
import java.nio.MappedByteBuffer;
class testbb {
static final int size = 536870904, n = size / 24;
static public long byteArrayToLong(byte [] in, int offset) {
return ((((((((long)(in[offset + 0] & 0xff) << 8) | (long)(in[offset + 1] & 0xff)) << 8 | (long)(in[offset + 2] & 0xff)) << 8 | (long)(in[offset + 3] & 0xff)) << 8 …Run Code Online (Sandbox Code Playgroud) 我的Java应用程序的片段:
JFrame f = new JFrame();
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice gd = ge.getDefaultScreenDevice();
gd.setFullScreenWindow(f);
Run Code Online (Sandbox Code Playgroud)
所以它的作用是让它自动全屏.现在奇怪的是程序是全屏的,但只能在一台显示器上!例如,我有一个带有两个屏幕的Windows Vista系统,它们组合在一个桌面上.怎么做才能让它全屏显示所有显示器?
好的我试过了:
import java.awt.image.ColorModel;
import java.awt.GraphicsConfiguration;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.Rectangle;
class grdevs
{
public static void main(String [] args)
{
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice[] gs = ge.getScreenDevices();
for(GraphicsDevice curGs : gs)
{
GraphicsConfiguration[] gc = curGs.getConfigurations();
for(GraphicsConfiguration curGc : gc)
{
Rectangle bounds = curGc.getBounds();
ColorModel cm = curGc.getColorModel();
System.out.println("" + bounds.getX() + "," + bounds.getY() + " " + bounds.getWidth() …Run Code Online (Sandbox Code Playgroud) 使用gpgme(gpg/gnupg的开发库),我正在尝试签署一些数据.在密钥环中,我有超过1个私钥,所以我想选择正确的私钥.这失败了:"Unusable secret key(117440566)".密钥是用gnupg2本身生成的.使用gnupg时也会出现问题.
sec 1024R/14B7E8E6 2015-05-27
Key fingerprint = 95C7 6C5E F839 43DA 2F32 2CF4 D2C2 5144 14B7 E8E6
uid testkey2 (testkey2) <test@vanheusden.com>
ssb 1024R/ED8059EA 2015-05-27
pub rsa1024/14B7E8E6
created: 2015-05-27 expires: never usage: SC
trust: ultimate validity: ultimate
sub rsa1024/ED8059EA
created: 2015-05-27 expires: never usage: E
sub rsa1024/74D6F5C6
created: 2015-05-31 expires: never usage: S
Run Code Online (Sandbox Code Playgroud)
首先,我检查是否有所选密钥的私钥:
gpgme_op_keylist_start(..., ..., 1);
if (gpgme_op_keylist_nex() == GPG_ERR_NO_ERROR) { proceed }
Run Code Online (Sandbox Code Playgroud)
签署:
gpgme_new()
gpgme_set_pinentry_mode(GPGME_PINENTRY_MODE_LOOPBACK) // yes i installed v2.1
gpgme_set_passphrase_cb()
/* ...binary to gpgme_data_t... */
gpgme_data_set_encoding(GPGME_DATA_ENCODING_BINARY) …Run Code Online (Sandbox Code Playgroud) 经过一些严肃的googleing后,我发现RandomAccessFile-class不是线程安全的.现在我可以使用一个信号量来锁定所有的读写操作,但我不认为它表现得非常好.理论上,应该可以一次执行多次读取和一次写入.我怎么能用Java做到这一点?有可能吗?
谢谢!
我有一个异步websockets侦听器。该侦听器从同步主循环传递消息。我想让异步websockets侦听器知道有一条新消息要发送。
目前,我使用轮询循环(不良)来实现该目标。我尝试使用cond.notify_all(),但是不能在异步代码之外使用?
代码片段:
ws_data = {}
ws_data_lock = threading.Lock()
async def ws_serve(websocket, path):
global ws_data
global ws_data_lock
listen_pair = await websocket.recv()
p_fen = None
while True:
send = None
with ws_data_lock:
if p_fen == None or ws_data[listen_pair] != p_fen:
send = p_fen = ws_data[listen_pair]
if send:
await websocket.send(send)
await asyncio.sleep(0.25)
Run Code Online (Sandbox Code Playgroud)
...
def run_websockets_server():
start_server = websockets.serve(ws_serve, ws_interface, ws_port)
asyncio.get_event_loop().run_until_complete(start_server)
asyncio.get_event_loop().run_forever()
def client_listener():
while True:
with ws_data_lock:
ws_data[pair_id] = (p1_user, p2_user, time.time())
# here I would like to let all websocket …Run Code Online (Sandbox Code Playgroud) 我怎样才能看到(在linux上)哪些线程拥有pthread_rwlock_t(或std::shared_mutex)?
对于常规互斥体,是否可以确定持有互斥体的线程?但如何对 ar/w 锁执行此操作?
在我的一个项目中,我不断压缩很少的数据块.现在我发现jvm然后增长到6GB的RAM(驻留(RES)RAM,不共享或虚拟等)然后因为内存不足而死亡.好像垃圾收集器从未运行过.我已经拿出相关代码并将其粘贴在下面.当我运行它(java6,32位linux)时,它增长到1GB内存.有人知道如何减少内存使用量?
import java.util.Random;
import java.util.zip.Deflater;
import java.util.zip.Inflater;
class test {
int blockSize = 4096;
Random r = new Random();
public test() throws Exception {
blockSize = 4096;
byte [] data = new byte[blockSize];
for(int index=0; index<blockSize; index++)
data[index] = (byte)r.nextInt();
for(long cnt=0; cnt<1000000; cnt++) {
byte [] result = compress(data);
if (result != null)
data[0] = result[0];
}
}
byte [] compress(byte [] in) {
assert in.length == blockSize;
Deflater compresser = new Deflater();
compresser.setInput(in);
compresser.finish();
byte [] out = …Run Code Online (Sandbox Code Playgroud) 我有以下 PL/I 代码:
declare 1 u union,
2 c character(1),
2 ci fixed binary(4) unsigned;
ci = data_mem(data_ptr);
put list (c);
Run Code Online (Sandbox Code Playgroud)
它的作用是接受一个整数并输出它,就好像它是一个 ascii/ebcdic 值一样。所以它显示了字符。到目前为止这有效。现在的问题是每个字符以24个空格间隔打印,就好像插入了3个TAB一样。我尝试先将 c 转换为字符串,然后应用 trim() 但这没有帮助。
有任何想法吗?
我想编写一个调用自身和其他函数的函数(在hlasm中).
在x86或z80(可能还有其他)上,您只需调用函数,并在其结尾处进行返回.然后处理器将存储和检索返回地址.
指令集有以下指令:BAL reg,func ...将寄存器中的寄存器地址存储在寄存器中,最后你可以将BR寄存器跳转到该寄存器地址.另一个问题是显然没有推/弹指令.
所以我现在有点st ..
问候
java ×4
c++ ×2
mainframe ×2
assembly ×1
asterisk ×1
asynchronous ×1
bytebuffer ×1
c++11 ×1
callstack ×1
fullscreen ×1
gnupg ×1
gpgme ×1
jvm ×1
locking ×1
nio ×1
performance ×1
pl-i ×1
python ×1
reentrancy ×1
swing ×1
zos ×1