小编Pet*_*iak的帖子

为什么将Data.Binary.Put monad更改为变换器会导致内存泄漏?

我正在尝试将Data.Binary.PutM monad修改为monad转换器.所以我从changin的定义开始

newtype PutM a = Put { unPut :: PairS a }
Run Code Online (Sandbox Code Playgroud)

newtype PutM a = Put { unPut :: Identity (PairS a) }
Run Code Online (Sandbox Code Playgroud)

然后我当然改变了return>> =函数的实现:

从:

return a = Put $ PairS a mempty
{-# INLINE return #-}

m >>= k  = Put $
    let PairS a w  = unPut m
        PairS b w1 = unPut (k a)
    in PairS b (w `mappend` w1)
{-# INLINE (>>=) #-}

m >> k  = Put …
Run Code Online (Sandbox Code Playgroud)

monads haskell memory-leaks monad-transformers

5
推荐指数
1
解决办法
470
查看次数

使用本机活动时关闭软键盘时崩溃

我们正在为Android开发一个独立游戏,并希望用户选择他的昵称.我们选择使用NDK提供的Native Activity,因为这似乎是最简单的方法.

我们用键盘遇到的第一个问题是,该功能ANativeActivity_showSoftInput()似乎做什么都没有(如例如这里),所以我们使用JNI调用函数调出键盘:

static void showKeyboard(Activity activity) {
  String s = Context.INPUT_METHOD_SERVICE;
  InputMethodManager m = (InputMethodManager)activity.getSystemService(s);
  View w = activity.getWindow().getDecorView();
  m.showSoftInput(w, 0);
}
Run Code Online (Sandbox Code Playgroud)

这适用于调出键盘,并且可以在一些设备上一起正常工作.但在其他设备(例如Nexus 7)上,当用户尝试通过点击"隐藏键盘"按钮关闭键盘时,应用程序会冻结此调试输出:

I/InputDispatcher(  453): Application is not responding: AppWindowToken{429b54a8 token=Token{42661288 ActivityRecord{41bb0b00 u0 com.example.project/android.app.NativeActivity}}} - Window{420d6138 u0 com.example.project/android.app.NativeActivity}.  It has been 5006.7ms since event, 5005.6ms since wait started.  Reason: Waiting because the focused window has not finished processing the input events that were previously delivered to it.
I/WindowManager(  453): Input event dispatching timed out sending to …
Run Code Online (Sandbox Code Playgroud)

android android-ndk android-layout native-activity

5
推荐指数
1
解决办法
4766
查看次数

将两个对象(其中一个包含对另一个对象的引用)传递到线程中

我有两个对象,第二个对象要求第一个对象比它更长,因为它包含对第一个对象的引用.我需要将它们都移动到一个线程中,但编译器抱怨第一个没有足够长的时间.这是代码:

use std::thread;

trait Facade: Sync {
    fn add(&self) -> u32;
}

struct RoutingNode<'a> {
    facade: &'a (Facade + 'a),
}

impl<'a> RoutingNode<'a> {
    fn new(facade: &'a Facade) -> RoutingNode<'a> {
        RoutingNode { facade: facade }
    }
}

fn main() {
    struct MyFacade;

    impl Facade for MyFacade {
        fn add(&self) -> u32 {
            999u32
        }
    }

    let facade = MyFacade;
    let routing = RoutingNode::new(&facade);

    let t = thread::spawn(move || {
        let f = facade;
        let r = routing;
    });

    t.join(); …
Run Code Online (Sandbox Code Playgroud)

reference lifetime move-semantics rust lifetime-scoping

5
推荐指数
1
解决办法
630
查看次数

我可以在编译时不知道大小的情况下在堆栈上分配`std :: array`吗?

在堆栈上进行分配时,我不必一定要知道在编译时分配的C数组的大小。即我可以做到这一点:

void foo(size_t s) {
    uint8_t bar[s]; // `s` not known at compile time
    some_func_that_uses_bar(bar, sizeof(bar));
}
Run Code Online (Sandbox Code Playgroud)

但是,为了减少出错的可能性,我觉得我也应该可以使用C ++来做到这一点std::array,但是我还无法弄清楚该怎么做(也不知道是否可能)。

c++

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