小编nat*_*ore的帖子

无法移出"Fn"闭包中捕获的外部变量

我试图弄清楚如何通过一个通道发送一个函数,以及如何避免额外的克隆,以便在另一端执行该函数.如果我在闭包内删除额外的克隆操作,我会收到以下错误:

error: cannot move out of captured outer variable in an 'Fn' closure
Run Code Online (Sandbox Code Playgroud)

忽略这个代码绝对没有任何东西,并使用全局可变静态这一事实Sender<T>,它代表了我正在尝试实现的同时给出正确的编译器错误.这段代码不打算运行,只是编译.

use std::ops::DerefMut;
use std::sync::{Arc, Mutex};
use std::collections::LinkedList;
use std::sync::mpsc::{Sender, Receiver};

type SafeList = Arc<Mutex<LinkedList<u8>>>;
type SendableFn = Arc<Mutex<(Fn() + Send + Sync + 'static)>>;
static mut tx: *mut Sender<SendableFn> = 0 as *mut Sender<SendableFn>;

fn main() {
    let list: SafeList = Arc::new(Mutex::new(LinkedList::new()));
    loop {
        let t_list = list.clone();
        run(move || {
            foo(t_list.clone());
        });
    }
}

fn run<T: Fn() + Send + Sync …
Run Code Online (Sandbox Code Playgroud)

function-pointers channel rust

18
推荐指数
1
解决办法
4215
查看次数

使用第三方DLL部署WPF应用程序

我一直非常沮丧地尝试部署我创建的C#/ WPF应用程序,该应用程序有一些对第三方DLL的引用.我在项目中创建了一个名为的文件夹lib,在那里我放置了所有这些DLL.在VS2012中,我通过浏览到该文件夹​​并选择所有DLL来添加引用. Copy Local设置为true所有.我构建和运行时一切都很好,但是当我选择发布并创建OneClick安装程序时,事情就不那么顺利了.在发布向导期间,我将其设置为从磁盘安装,并将其设置为从不检查更新.我拿这个文件夹,把它放在闪存驱动器上,插入另一台PC,运行安装程序,然后抛出异常.我相信我知道发生了什么,但我无法弄清楚如何打包它以便正确部署它.

我的一个DLL是为C++项目设计的DLL的C#包装器.我们会说,Application要求DLL1DLL1要求DLL2. DLL2无法作为项目中的引用添加,因为它不是.NETDLL. DLL1需要DLL2在同一个文件夹中才能拿起它.我正在使用封装Chromium Embedded Framework的CefSharp.

我已经尝试将CefSharp.dll所需的DLL放在publish/Application Files目录中,但它不起作用.我注意到VS2012中存在的所有DLL都有一个.deploy扩展,我甚至去添加了扩展,看看它是否正在扫描它,但它也没有用.这是我第一次为Windows应用程序进行开发和部署,我读过的所有关于MSDN或博客文章的教程似乎都没有涵盖这种情况,我在Deployment Manager中看不到任何其他选项来处理这些案件类型.

如果有帮助,抛出的异常代码是: CLR20r3

当我抓住并显示Exception时,我提供的所有信息基本上都是这样说的CefSharp.dll or one of it's dependencies cannot be loaded.我之前得到的时间DLL2不在同一个文件夹中DLL1.

任何人都可以提供有关如何从VS2012部署这种情况的帮助吗?

提前致谢!

编辑:信息更新

我试图将调试版本版本推送到没有安装Visual Studio的测试机器.在构建CefSharp或任何其他C++ Runtime时DLL,它将查找DLL通常具有相同名称但在末尾添加字母"d"的所有Debug版本.如下所述,C++ Runtime的Debug版本不可再发行.并不是说你不能手动将它们添加DLLs到你的项目并将它们设置为Copy Always,但这是一种黑客工作.我从头开始了一个新项目,添加了DLL的所有Release版本,并且一切都很好.

dll clickonce windows-installer visual-studio-2012 cefsharp

14
推荐指数
1
解决办法
8808
查看次数

如何在Rust中将匿名函数作为参数传递?

Rust过去一周我一直在玩弄.我似乎无法弄清楚如何在调用方法时传递一个被定义为参数的函数,并且没有遇到任何显示它们以这种方式使用的文档.

在调用函数时,是否可以在参数列表中定义函数Rust

这是我到目前为止所尝试的......

fn main() {

    // This works
    thing_to_do(able_to_pass);

    // Does not work
    thing_to_do(fn() {
        println!("found fn in indent position");
    });

    // Not the same type
    thing_to_do(|| {
        println!("mismatched types: expected `fn()` but found `||`")
    });
}

fn thing_to_do(execute: fn()) {
    execute();
}

fn able_to_pass() {
    println!("Hey, I worked!");
}
Run Code Online (Sandbox Code Playgroud)

function-pointers anonymous-function rust

13
推荐指数
1
解决办法
5080
查看次数

声明结构中闭包的生命周期

从我可以找到的各种来源,给一个属性的生命struct将如下所示:

pub struct Event<'self> {
    name: String,
    execute: &'self |data: &str|
}
Run Code Online (Sandbox Code Playgroud)

&'self现在不推荐使用生命周期.当声明一个属性是一个闭包类型时,编译器告诉我它需要一个生命周期说明符,但我找不到一个有闭包作为结构属性的示例.

这就是我目前正在尝试的:

pub struct Event<'a> {
    name: String,
    execute: &'a |data: &str|
}
Run Code Online (Sandbox Code Playgroud)

但是我收到以下错误: error: missing lifetime specifier [E0106]

什么是声明的一生语法正确closurestruct,或任何类型为此事?

lifetime rust

11
推荐指数
1
解决办法
1964
查看次数

使用TcpStream强制非阻塞读取

我有一个线程,维护一个套接字列表,我想遍历列表,看看是否有任何东西要读,如果有的话 - 采取行动,如果没有 - 转移到下一个.问题是,当我遇到第一个节点时,所有执行都会暂停,直到读取内容出现.

我正在使用 std::io::Read::read(&mut self, buf: &mut [u8]) -> Result<usize>

来自doc

此函数不提供是否阻止等待数据的任何保证,但如果对象需要阻止读取但不能通过Err返回值发出信号.

深入研究源代码,TcpStream Read实现是

impl Read for TcpStream {
    fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> { self.0.read(buf) }
}
Run Code Online (Sandbox Code Playgroud)

哪个调用

pub fn read(&mut self, buf: &mut [u8]) -> IoResult<uint> {
    let fd = self.fd();
    let dolock = || self.lock_nonblocking();
    let doread = |nb| unsafe {
        let flags = if nb {c::MSG_DONTWAIT} else {0};
        libc::recv(fd,
                   buf.as_mut_ptr() as *mut libc::c_void,
                   buf.len() as wrlen,
                   flags) as libc::c_int …
Run Code Online (Sandbox Code Playgroud)

sockets tcp rust

9
推荐指数
1
解决办法
1806
查看次数

终身麻烦在线程之间共享引用

我有一个启动工作线程的线程,所有线程都应该永远存在.每个工作线程都维护着自己的Sockets 列表.

有些操作要求我遍历当前活动的所有套接字,但是我在尝试创建包含指向另一个列表所拥有的套接字的指针的套接字的主列表时遇到了麻烦.

use std::{str, thread};
use std::thread::JoinHandle;
use std::io::{Read, Write};
use std::net::{TcpListener, TcpStream};
use std::sync::{Arc, Mutex};
use std::ops::DerefMut;
use std::sync::mpsc::{channel, Sender, Receiver, TryRecvError};
use self::socketlist::SocketList;
use self::mastersocketlist::MasterSocketList;

pub struct Socket {
    user: String,
    stream: TcpStream,
}

mod socketlist {
    use self::SocketList::{Node, End};
    use super::Socket;

    pub enum SocketList {
        Node(Socket, Box<SocketList>),
        End,
    }

    impl SocketList {
        pub fn new() -> SocketList {
            End
        }

        pub fn add(self, socket: Socket) -> SocketList {
            Node(socket, Box::new(self))
        }

        pub fn newest<'a>(&'a …
Run Code Online (Sandbox Code Playgroud)

lifetime rust

9
推荐指数
1
解决办法
3600
查看次数

RTSP/RTMP视频流客户端iOS

我需要一个开源解决方案/库来将RTSP/RTMP流式传输到iOS应用程序.我需要构建一个连接到媒体服务器的应用程序,并打开提供的视频流.我相信必须有库,但我还没有找到一个开源,编译,实际工作,并在iOS 5 +,iPhone 4+上运行.我没有偏好,RTMPRTSP不会满足.优选地,具有最少工作量的那个.我在Android方面有RTSP工作,但iOS尚无用.

这就是我今天从研究中已经知道的 -

RTSP

  • 似乎可以使用Live555/FFMPEG
  • MooncatVenture Group - 旧版FFMPEG,与ARMv7s不兼容(一年内无更新/博客/提交)
  • DFURTSPPlayer - 这是一个工作示例.

RTMP

  • 似乎可以使用Live555/FFMPEG
  • 有一些库用于数据消息传递,但仅此而已
  • MidnightCoders项目 - 似乎还没有构建视频支持,因为Audio不支持.

我以前从未搞过与之相关的任何视频,所以编码,帧速率,关键帧,块等等对我来说都很陌生.现在,似乎从Live555/FFMPEG构建静态二进制文件是解决我问题的唯一方法.如果是这样,有人可以给我一个简单的快速入门指南或链接到博客/示例有人在那里吗?我不是在寻找任何疯狂的东西,只是一个简单的东西

  1. 下载此 - 链接
  2. 像这样编译它 - LINK
  3. 将它放入Xcode的X文件夹中
  4. 创建X对象
  5. 在此处阅读Stream API - LINK

如果没有,有人想指出我的工作开源库吗?

哦,是的,这恰好是我的第一个iPhone应用程序,第一次在Objective-C.令人敬畏的第一个项目,是吗?

ffmpeg rtmp rtsp ios live555

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

是否可以为函数的泛型类型创建一个具有特征边界的类型别名?

这段代码:

pub type Foo<T: Read> = fn(bar: T);
Run Code Online (Sandbox Code Playgroud)

产生错误 E0122(在较新版本的 Rust 中,这只是一个警告):

已尝试向类型别名添加通用约束。这个约束完全被忽略了。为了向后兼容,Rust 仍然允许这样做并带有警告。考虑下面的例子:

trait Foo {}

type MyType<R: Foo> = (R, ());

fn main() {
    let t: MyType<u32>;
}
Run Code Online (Sandbox Code Playgroud)

我们能够声明一个类型为 的变量MyType<u32>,尽管事实上u32它没有实现Foo。因此,应该避免将泛型约束与类型别名一起使用。

是否可以创建一个包含对函数指针的特征要求的类型别名?显然,编译器告诉我没有类型,但不知道是否还有其他我没有想到的函数选项。

generics function-pointers traits rust type-alias

7
推荐指数
2
解决办法
4095
查看次数

如何在Debian上为armv8 cortex-a53安装aarch64工具链?

我想在ARM芯片上启动低级编程.我已经安装QEMU和遵循的hello world类型的东西几个示例程序,但现在我要定位的最新树莓派,它具有ARMv8 cortex-a53neon-fp-armv8FPU.我目前正在运行Debian:

$ lsb_release -a
    No LSB modules are available.
    Distributor ID: BunsenLabs
    Description:    BunsenLabs GNU/Linux 8.5 (Hydrogen)
    Release:    8.5
    Codename:   bunsen-hydrogen

$ cat /etc/debian_version
    8.5
Run Code Online (Sandbox Code Playgroud)

我目前安装了以下工具链:

binutils-arm-none-eabi
gcc-arm-none-eabi
gdb-arm-none-eabi
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试编译时-mcpu=cortex-a53,我收到以下错误:

arm-none-eabi-gcc: error: unrecognized argument in option '-mcpu=cortex-a53'

$ arm-none-eabi-gcc --version
    arm-none-eabi-gcc (4.8.4-1+11-1) 4.8.4 20141219 (release)
Run Code Online (Sandbox Code Playgroud)

我认为我有一个更老的GCC不含有该目标的CPU,所以我试图下载的binutils,GCC和gdb的源代码,但我无法建立的binutils.尝试时总是失败make all.

binutils配置:

$../../src/binutils-2.26.51/configure \
 --target=arm-none-eabi \
 --disable-nls
Run Code Online (Sandbox Code Playgroud)

构建错误:

$make -j4
    checking for bison... /home/nathan/development/tools/arm/src/binutils-2.26.51/missing bison -y
    checking for flex... /home/nathan/development/tools/arm/src/binutils-2.26.51/missing flex
    checking lex output file …
Run Code Online (Sandbox Code Playgroud)

gcc arm toolchain

6
推荐指数
1
解决办法
9142
查看次数

使用需要大小的特征对象

我想要一个LinkedListtrait 对象包装器结构。内部将是 Ssl 或非 Ssl 流的流类型。我的希望是传递结构包装器,只要内部符合相同的特征,无论使用何种内部流类型,一切都会好起来。

简单的例子:

use std::sync::{Arc, Mutex};
use std::collections::LinkedList;
use std::os::unix::io::{RawFd, AsRawFd};

pub trait HRecv {}
pub trait HSend {}
pub trait HStream: HRecv + HSend + AsRawFd + Clone {}
pub struct Stream<T: HStream> {
    pub inner: T
}

pub type StreamList = Arc<Mutex<LinkedList<Stream<HStream>>>>;

fn main() {
    let mut list = Arc::new(Mutex::new(LinkedList::<Stream<HStream>>::new()));
}
Run Code Online (Sandbox Code Playgroud)

产生以下错误:

error: the trait 'core::marker::Sized' is not implemented for the type 'HStream' [E0277]
let mut list = Arc::new(Mutex::new(LinkedList::<Stream<HStream>>::new()));
                                                ^~~~~~~~~~~~~~~
Run Code Online (Sandbox Code Playgroud)

我尝试添加+ …

generics traits rust

5
推荐指数
2
解决办法
2379
查看次数