netwjx

混乱与有序

WinForms开发中SynchronizationContext和Invoke的使用注意事项

| 评论

WinForms 开发中Control.Invoke是用于非UI线程中请求修改UI元素的方法, 一般配合Control.InvokeRequired使用:

Control.Invoke and Control.InvokeRequired
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public partial class Form1 : Form
{
    private void Foo(string text)
    {
        if (InvokeRequired)
        {
            Invoke((Action<string>)Foo, text);
        }
        else
        {
            textBox1.Text = text;
        }
    }
}

类似Control.Invoke的还有Control.BeginInvokeControl.EndInvoke, 它们是异步调用.

这些方法和属性都依赖于IsHandleCreatedtrue时, IsHandleCreated表示窗口句柄是否已创建, 它并不是指是否new Form1()过, 而是指是否Show()过, 包括Application.Run, Show, ShowDialog这些调用都会使IsHandleCreatedtrue.

而在IsHandleCreatedfalse时, 比如刚刚new Form1(), Control.InvokeRequired返回false, 调用Control.Invoke会抛出异常:

System.InvalidOperationException: 在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke。

在Octopress中使用代码高亮

| 评论

Octopress中使用代码高亮, 实际就是JekyllPygments代码高亮, 效果如下

``` js Javascript Hello World 
    alert('hello world');
```

效果

Javascript Hello World
1
alert('hello world');

而默认安装Octopress时对代码高亮还是不支持的, 还需要安装Python, 我没有使用ActivePython, 而是CPython, 安装好后应该会有c:\Windows\System32\python27.dll.

但是现在还可能会出现Could not open library’.dll’的问题.

捕获摄像头信息

| 评论

最近有做一个从摄像头获取信息的程序, 期间查找了各种方案, 这里列出一些总结.

实现方案

  1. avicap32.dll 的实现 Win32API

    主要使用capGetDriverDescriptionA函数获取获取摄像头设备, 使用capCreateCaptureWindowSendMessage发送一系列窗口消息控制, 图像数据使用一个PictrueBox控件来显示, 有可以保存到avi文件.

    其属于Video for Windows技术, 代码示例可以参考How to Interface to a Video Device and Capture Video and Images, C#的代码示例可以参考_VideoCapturer.cs, 以及MSDN上的参考Video Capture

    这个实现方法无法使用虚拟摄像头, capGetDriverDescriptionA不会返回任何虚拟摄像头设备.

在jQuery中发生’Object’ 未定义

| 评论

之前发现一个比较奇怪的现象, 一个很典型的页面, 总是在打开时会在jQuery中的一个位置发生 'Object' 未定义 的错误, 并且只在首次打开, 编译需要时间, 加载也比平时慢点的情况下.

在不使用jQuery的页面也发生类似现象, 错误可能是window未定义, document未定义之类的.

仅ie9下有这个现象, 忽略这个错误后仍能正常打开页面, 没有任何功能有问题.

爬山备忘

| 评论

前几天去爬山,记下中间需要注意的事项,有些备忘的适用场景不限于爬山.

准备工作

下面只是尽量列出,按需要准备

Google Play/Android Market 解锁

| 评论

Android Market刚改名叫Google Play不久,不明白为什么改成这个名字,难道Play后面还有Game?

说说标题上的事,如果使用浏览器查找应用,应用是免费的,但是安装哪里会提示”此商品无法在您设备所在的国家/地区安装”.

在Google帐号设置里面怎么改都没作用.

而用手机搜索,要么搜不到,要么搜到了点安装仍旧是上面的提示.

上面提示的依据只依据一个 手机卡的网络运营商.

搜到一些解决办法是使用Market Enabler,但是我尝试的结果是没作用,应该是升级到了Google Play以前的方法失效了.

Fork me on GitHub