解决方案:
通过委托的方式,实现将当前线程的将要执行的命令,插入到访问控件的线程中.
经典的解释:
你想要买东西,然而你没有足够的零花钱(没有足够的权限),你需要通过你老爸帮你买东西(执行功能代码)。
你不能直接拿你老爸的钱包去买东西(跨线程),因为这样子是不合适的。
但你可以告诉你老爸你喜欢这玩具(委托),让你老爸拿自己的钱包去买东西(让控件的所在线程执行功能代码)。
实现过程:
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
**************************************
从实习到正式入职,在过四天,也就是自己在G社待了一年一个月了的。自己从工程能力几乎为零的菜鸟小白,到现在能够独立负责项目的菜鸟大白。自己很有幸的成为G社大家庭的一员。在G社这一年多的时间里,一直都在和一群优秀有趣的人共事,度过得很开心很欢乐。自己也一直都是在学习中度过的,然而,学习越多不懂也越多。
在亲朋好友都在为我现在这样的发展骄傲时,自己一开始也有点飘飘然了的。虽然,自己明白相比名校里面的优秀学生仍然也有不少差距,但在我之前所处的圈子里,自己算是(实力+机遇)发展最好的了,而且能在毕业后有这样高的薪资福利待遇以及肯培养新人的公司。好在生活总会在我最得意的时候打击我。我下一届的一个集训队的学弟(也是一队的核心成员之一),获得了去苏州MS实习的机会,按照MS近年来的惯例,毕业后入职MS也理所应当。MS算是大多数程序员的最理想的公司之一吧。我上上届的一个学长,不久刚成功入职了蚂蚁金服的高级算法工程师(机器学习)。相比他们以后的发展前景来说,我似乎有点微不住道了的。当然,我也很替他们开心。他们也让我看到了希望,点燃了我奋斗的激情。毕竟,身边就有这样的大佬存在也挺好的。他们让我更加有奋斗的激情,让我时时刻刻认清自己。
我不想比别人差,不能止步不前,认清自己,看看自己能走多远。
成长计划(初始版本):
【周(末)计划】
1.写一篇【技术干货】的博客(内容不限)。
2.学习C++相关知识,写一篇【C++学习记录】的博客。
3.学习服务器架构开发相关知识,写一篇【服务器构架开发】的博客。
4.周更新准开源项目Gsc(以后要整合成开源项目),写一篇【Gsc 编译器开发】的博客。
【日(常)计划】
1.每天一题编程题,写一篇【LeeCode 每日N题】的博客。
2.每天一局游戏(周六晚除外),写一篇【游戏技巧】的博客(有玩游戏则必须写)。
3.学习C++相关知识,更新【C++学习记录】的博客。
4.学习服务器构架开发的相关知识,更新【服务器构架开发】的博客。
【额外计划】
1.每周二,周四学习新算法,写一篇【算法详解】的博客。
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
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 };
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 };
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 };
1 // 注意:需要同时改变传入的数组的值
2 class Solution {
3 public:
4 int removeDuplicates(vector<int>& nums) {
5 map<int, int>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 };
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 };
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
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