<2024年4月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

统计

  • 随笔 - 57
  • 文章 - 7
  • 评论 - 0
  • 引用 - 0

常用链接

留言簿

随笔分类

随笔档案

文章分类

文章档案

Blog

Coder 必备技巧

Compiler for Wurq

搜索

  •  

最新评论

阅读排行榜

评论排行榜

【技术干货】在C#的涉及UI的开发中,跨线程直接访问控件的解决方案

解决方案:
  
通过委托的方式,实现将当前线程的将要执行的命令,插入到访问控件的线程中.
   经典的解释:
     
你想要买东西,然而你没有足够的零花钱(没有足够的权限),你需要通过你老爸帮你买东西(执行功能代码)。
      你不能直接拿你老爸的钱包去买东西(跨线程),因为这样子是不合适的。
      但你可以告诉你老爸你喜欢这玩具(委托),让你老爸拿自己的钱包去买东西(让控件的所在线程执行功能代码)。

实现过程:
a.创建委托函数delegate void MyDele();
b.将要执行的功能代码封装成独立函数或Lambda表达式或者匿名方法,添加到委托事件中。
    独立函数:
        MyDele my 
= new MyDele(独立函数名);
        
    Lambda表达式:
        MyDele my 
=(传参)=>{要执行的功能代码;};

    匿名方法:
        MyDele my 
= delegate(传参){要执行的功能代码;};

c.将委托插入到访问控件的线程中。
    
this.BeginInvoke(委托事件名,传参);

WinForm的UI开发:

   可以通过control.InvokeRequired判断该控件是属于本线程,如果不属于本线程,则返回ture。
   通过在函数头对control.InvokeRequired的判断,能够将所在函数作为独立函数调用。
void TestFunction()
{
    
if(control.InvokeRequired)
    {
        MyDele my  
= new MyDele(TestFunction);
        
this.BeginInvoke(my,);
        
return;    
    }

    要执行的功能代码;    
}
   在跨线程调用控件时,会创建委托事件,将该函数添加到委托事件中,插入到访问控件的线程中,并且退出该函数。
   当所访问控件的线程执行到该委托事件时,由于该控件是在本线程执行。因此,不会创建委托事件,从而执行功能代码。

MFC的UI开发:
   MFC的Invoke相关的API是存在control.Dispatcher中,但不存在InvokeRequired这API。
   由于不存在InvokeRequired这API,因此无法判断是否跨线程调用控件。
   不能够将所在的函数作为独立函数调用(如上述的实现方式)。
   只能通过常规的实现方式实现:
void TestFunction()
{
    
// a.独立函数: 
    MyDele my = new MyDele(独立函数名);
        
    
// b.Lambda表达式:
    MyDele my =(传参)=>{要执行的功能代码;};

    
//c.匿名方法:
    MyDele my = delegate(传参){要执行的功能代码;};

    
this.Dispatcher.BeginInvoke(my,传参);
}
   通过将要执行的功能代码/函数,添加到委托事件中,再将该委托事件插入到控件所在的线程,让控件所在的线程执行该功能代码/函数。

转载请备注:
**************************************
* 作者: Wurq 
* 博客: http://www.cppblog.com/wurq/ 
* 日期: 2017/8/16 
**************************************

posted @ 2017-08-16 22:50 Wurq 阅读(155) | 评论 (0)编辑 收藏
【成长计划 2017/8/14】第一个月的成长计划

    从实习到正式入职,在过四天,也就是自己在G社待了一年一个月了的。自己从工程能力几乎为零的菜鸟小白,到现在能够独立负责项目的菜鸟大白。自己很有幸的成为G社大家庭的一员。在G社这一年多的时间里,一直都在和一群优秀有趣的人共事,度过得很开心很欢乐。自己也一直都是在学习中度过的,然而,学习越多不懂也越多。
    在亲朋好友都在为我现在这样的发展骄傲时,自己一开始也有点飘飘然了的。虽然,自己明白相比名校里面的优秀学生仍然也有不少差距,但在我之前所处的圈子里,自己算是(实力+机遇)发展最好的了,而且能在毕业后有这样高的薪资福利待遇以及肯培养新人的公司。好在生活总会在我最得意的时候打击我。我下一届的一个集训队的学弟(也是一队的核心成员之一),获得了去苏州MS实习的机会,按照MS近年来的惯例,毕业后入职MS也理所应当。MS算是大多数程序员的最理想的公司之一吧。我上上届的一个学长,不久刚成功入职了蚂蚁金服的高级算法工程师(机器学习)。相比他们以后的发展前景来说,我似乎有点微不住道了的。当然,我也很替他们开心。他们也让我看到了希望,点燃了我奋斗的激情。毕竟,身边就有这样的大佬存在也挺好的。他们让我更加有奋斗的激情,让我时时刻刻认清自己。
    我不想比别人差,不能止步不前,认清自己,看看自己能走多远。

成长计划(初始版本):



    
    

posted @ 2017-08-14 16:54 Wurq 阅读(194) | 评论 (0)编辑 收藏
【LeeCode 2017/07/04】38. Count and Say

 1 class Solution {
 2 public:
 3     string countAndSay(int n) {
 4         list<int>v;
 5         v.push_back(1);
 6         while (--n)
 7         {
 8             list<int>tmp;
 9 
10             int num = -1;
11             int count = 0;
12             while (!v.empty())
13             {
14                 if (num == -1) {
15                     num = v.front();
16                     count++;
17                 }
18                 else if (v.front() == num)
19                 {
20                     count++;
21                 }
22                 else 
23                 {
24                     tmp.push_back(count);
25                     tmp.push_back(num);
26                     count = 0;
27                     num = v.front();
28                     count++;
29                 }
30                 v.pop_front();
31             }
32 
33             tmp.push_back(count);
34             tmp.push_back(num);
35 
36             v = tmp;
37         }
38 
39         string str = "1";
40 
41         if (!v.empty())
42             str = "";
43 
44         while (!v.empty()){
45             str += v.front() + '0';
46             v.pop_front();
47         }
48 
49         return str;
50     }
51 };
52 

posted @ 2017-07-04 19:51 Wurq 阅读(125) | 评论 (0)编辑 收藏
【LeeCode 2017/07/03】35. Search Insert Position

 1 class Solution {
 2 public:
 3     int searchInsert(vector<int>& nums, int target) {
 4         for (int i = 0; i < nums.size(); i++) {
 5             if (nums[i] >= target)
 6                 return i;
 7         }
 8         return nums.size();
 9     }
10 };

posted @ 2017-07-03 15:59 Wurq 阅读(106) | 评论 (0)编辑 收藏
【LeeCode 2017/07/01】28. Implement strStr()

 1 // 子串为空则任意匹配
 2 class Solution {
 3 public:
 4     int strStr(string haystack, string needle) {
 5         int len_s = haystack.length();
 6         int len_t = needle.length();
 7 
 8         bool is_cmp = (haystack == needle) || needle == "";
 9         for (int i = 0; i < len_s; i++)
10         {
11             if (haystack[i] != needle[0])
12                 continue;
13 
14             is_cmp = true;
15             for (int j = 0; j < len_t; j++) {
16                 if (i + j<len_s && haystack[i + j] == needle[j])
17                     continue;
18 
19                 is_cmp = false;
20                 break;
21             }
22 
23             if (is_cmp)
24                 return i;
25         }
26 
27         return is_cmp ? 0 : -1;
28     }
29 };

posted @ 2017-07-01 14:04 Wurq 阅读(98) | 评论 (0)编辑 收藏
【LeeCode 2017/06/30】27. Remove Element

 1 class Solution {
 2 public:
 3     int removeElement(vector<int>& nums, int val) {
 4         int count = 0;
 5         vector<int> ans;
 6         for (int  i = 0; i < nums.size(); i++){
 7             if (nums[i] != val)
 8             {
 9                 ans.push_back(nums[i]);
10                 count++;
11             }
12         }
13         ans.resize(count);
14         nums = ans;
15         return count;
16     }
17 };

posted @ 2017-06-30 09:25 Wurq 阅读(93) | 评论 (0)编辑 收藏
【LeeCode 2017/06/29】26. Remove Duplicates from Sorted Array

 1 // 注意:需要同时改变传入的数组的值
 2 class Solution {
 3 public:
 4     int removeDuplicates(vector<int>& nums) {
 5         map<intint>m;
 6         int count = 0;
 7         vector<int> ans;
 8         for (int  i = 0; i < nums.size(); i++){
 9             if (m[nums[i]] == 0)
10             {
11                 ans.push_back(nums[i]);
12                 m[nums[i]]++;
13                 count++;
14             }
15         }
16         ans.resize(count);
17         nums = ans;
18         return count;
19     }
20 };

posted @ 2017-06-29 19:21 Wurq 阅读(96) | 评论 (0)编辑 收藏
【LeeCode 2017/06/28】21. Merge Two Sorted Lists

 1 /* LeeCode题目默认的排序方式为从小到大 */
 2 class Solution {
 3 public:
 4     ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
 5 
 6         ListNode* Head = new ListNode(-1);
 7         ListNode* p = Head;
 8 
 9         if (l1 == nullptr && l2 == nullptr)
10             return nullptr;
11 
12         if (l1 == nullptr || l2 == nullptr)
13             return l1 == nullptr ? l2:l1;
14 
15         while (l1 != nullptr && l2 != nullptr)
16         {
17             if (l1->val < l2->val){
18                 p->next =l1;
19                 l1 = l1->next;
20             }
21             else {
22                 p->next = l2;
23                 l2 = l2->next;
24             }
25             p = p->next;
26         }
27 
28         if (l1 != nullptr)p->next = l1;
29         if (l2 != nullptr)p->next = l2;
30 
31         return Head->next;
32     }
33 };

posted @ 2017-06-28 10:33 Wurq 阅读(90) | 评论 (0)编辑 收藏
【LeeCode 2017/06/27】20. Valid Parentheses

 1 class Solution {
 2 public:
 3     bool isValid(string s) {
 4         stack<char>q;
 5         for (int i = 0; i < s.length(); i++)
 6         {
 7             char ch = s[i];
 8             if (!q.empty())
 9             {
10                 if (ch == ')' &&q.top() == '(' ||
11                     ch == ']' &&q.top() == '[' ||
12                     ch == '}' &&q.top() == '{')
13                     q.pop();
14                 else
15                     q.push(ch);
16             }
17             else
18                 q.push(ch);
19         }
20         int ret = false;
21         if (q.empty())
22             ret = true;
23 
24         return ret;
25     }
26 };
27 

posted @ 2017-06-27 09:49 Wurq 阅读(102) | 评论 (0)编辑 收藏
【LeeCode 2017/06/26】14. Longest Common Prefix

 1 class Solution {
 2 public:
 3     string longestCommonPrefix(vector<string>& strs) {
 4         int count = strs.size();
 5         int prt_ch[300= {0};
 6 
 7         int max_len = 0;
 8         for(int i=0;i<count;i++){
 9             max_len = max_len >= strs[i].length()? max_len:strs[i].length();
10         }
11         vector<vector<int>>prt_str;
12         prt_str.resize(max_len);
13         for (int i = 0; i < max_len; i++) {
14             prt_str[i].resize(300);
15         }
16 
17         for (int i = 0; i < count; i++){
18             for (int j = 0;j < strs[i].length(); j++){
19                 prt_str[j][strs[i][j]]++;
20             }
21         }
22         string ans = "";
23         if (count <= 0)
24             return ans;
25             
26         for (int i = 0; i < strs[0].length(); i++){
27             if (prt_str[i][strs[0][i]] == count)
28                 ans += strs[0][i];
29             else
30                 break;
31         }
32         return ans;
33     }
34 };
35 

posted @ 2017-06-26 17:13 Wurq 阅读(106) | 评论 (0)编辑 收藏
仅列出标题
共6页: 1 2 3 4 5 6