更新
This commit is contained in:
@@ -1,5 +0,0 @@
|
||||
https://dc.services.visualstudio.com/v2/track
|
||||
Content-Type:application/x-json-stream
|
||||
Content-Encoding:gzip
|
||||
|
||||
H4sIAAAAAAAACpSUy27dNhCGX0XgWpR5Ey/apXaKukZgIzbaojtehjYRHeqAok4aGOfdC8onSNxdd8SAM/PPx5/zirI9AJrQh+Px4wlyXVGPatpDjDCJCceUPlEyUTpxNjCuBR3l36hH6Q6+oQkp4T31BjAHCVgEMmLHo8chgKGEBsJG0Wra5xVNr8imIcApeRiW9Q8oa1oymtCfKYfla+tt0+DnZQtDWWa4zWu12TcxNx8f757uH/C1oOT6/pe3myusrcCQApqQZRIijREL70YsjDbYCD1i8MwpIaS3yr2lpVyhZDsPa/jyQ0NYaobqpzbkQDAz6NyjYKttsp1d4enbsSnZMd20eL+H9+P0ik5Q0MT670Dfyl35OV3V5TjDCeajLSuUK78cDjYH1KNjWY5QaoIdzT7tPNualtxdml3PCXJFPbp/7B5mW+NSDu94Pb4huP0fBE5QHJoQJyOXSoHgnFsjHSMQlPRSMuctUdExoB7IaIQyVBHKDSOGj1JpFSwxHvXoeV6cnX9fd36GEacDUUwyEGCYkNJ4AlxDHBWQYKV0UnsTuFZM6KC5NdZS40B5I30zySfrX1KG7vYGTUgbEbU3EYsxjFiAFthoTrANYFSAkWuiUY+ul1xT3pZt7W5zheey80MT+tXOK7yR+1D8S6rg61Ya1L9ka/ZQlrD52v1wACUDGSjhLWmrx612nyGkAr5Cw/tUtku9/6QwyQhpUrZSINfuwdaX7je7vqAJQRBUBW+s1IZG5ZWMo4yaaA6OCBmjkHRUVI7a2dG5KH0IwZnIgjfGEIN6BM1w3e5xp0TkFDhWTHssgpDYKkqw8X7UiijvRHzHsbufW56RzlpmKHZGCSy8ItgFN2KtCaNROMM8+wnJxXyi8b2DkmH+aeRPyZdlXWLtLi7s3kH4vOW2P7rdkV9Txv/stG8W/wVK117Lpty+yuWBzj06gF23Aod9/Uyv6KH9k+5p30KcDpJq0aPHakvdjt/D40C11ufz+fwvAAAA//8DAIVrT6vDBAAA
|
||||
@@ -1,5 +0,0 @@
|
||||
https://dc.services.visualstudio.com/v2/track
|
||||
Content-Type:application/x-json-stream
|
||||
Content-Encoding:gzip
|
||||
|
||||
H4sIAAAAAAAACpSUy27cOBBFf0XgWpT5fmiXsTMYwwhsxEYmmB0fxZiIWmpQVGcCo/99QLUDJ7PLjiiwirdOXdYLmt0B0IjeHY/vTzDXFfWo5j3ECFOYcEzpEyUjpSNnAyfSCk3/QT3Kd/AdjUiLEGiwgDkowCISiT1PAccIlhIaCZOi1XRfVjS+IJeHCKccYFjWT1DWvMxoRH/nOS7f2tsuD2FatjiUZYLbea1uDk3MzfvHu6f7B3wtKLm+/+Nyc4W1FRhyRCNyTEGiKWERvMTCGoutMBJDYF4LoYLT/pKW5wpldtOwxq9vGuJSZ6hhZAPjA8HMonOPoquuyfZuhafvx6Zkx3TT4v0e3o/jCzpBQSPrfwC9lLsKU75aNz/BCaajKyuUq7AcDm6OqEfHshyh1Aw7mhMUv6y5NqohaGcMpdE4LaSOhkvGdeQEoiFaRhutU0IlFqRM0RurRRKRUREVCOE16tEOb5pczcvcvWq/njLMFfXo/rF7mFxNSzn8gv/xQvT2N4A22WhEnEiutAbBOXdWeUYgahWUYj44opNnQAPs9rFUE8otI5ZLpY2OjtiAevTBhec8Q3d7g0ZkrEgm2ISFjBILMAJbwwl2EayOILkhBvXoeplrnrdlW7vbucKXsveLRvSnm1a4dPquhOdcIdStNAifVTPkQ1niFmr3ZgBKBjJQwlvSVo9b7T5CzAVChYbjqWyv9f6XwhQjpEnZSoG5dg+uPnd/ufUZjQiioDoG65SxNOmgVZIqGWI4eCJUSkJRqamSxjvpfVIhxuhtYjFYa4lFPYLmt263eAJvTRAcC+4kFtxT7KVV2ABII5VigbXW3jh291PLs8o7xyzF3mqBRdAE++glNoYwmoS3LLCfkLyaRTS+d1BmmH5q+UMOZVmXVLtX13S/QPi4zW19dLuDvuUZ/7vTvlnCVyhdm5bLc/sprwM69+gAbt0KHPbtM76gh/ZNuqd9CXE6KGpEjx6rK3U7/gjLgRpjzufz+T8AAAD//wMAXcXEucIEAAA=
|
||||
@@ -1,5 +0,0 @@
|
||||
https://dc.services.visualstudio.com/v2/track
|
||||
Content-Type:application/x-json-stream
|
||||
Content-Encoding:gzip
|
||||
|
||||
H4sIAAAAAAAACpRUy07kOBT9lcjbidO242d2NEVrEKJBTWlmNDs/bsBDyik5DgxC9e+tpKAbaM1iNlF0dR/nnnOun1GyO0AdOtnvzx4glQnVqMQ1xAiTmLSY0i0lHWUdUQ0hikul/0Y1ihfwhDqkuPfUG8AtSMA8EIFd23scAhhKaCBM8KWnvZ1Q94xsbAI8RA/NOP0BeYpjQh36M6YwPi6zbWz8MM6hyeMA52kqNvkFzObs5mJ7dY1POSWnV5+PmRNMS4MmBtQhyyT0tO8x905gbrTBhmuBwTOnOJfeKncsi6lATnZopnD/E0MYS4LiO9awtiGYGXSoUbDFLrCdnWD7tF+QrDRtlni9htff7hk9QEYdq18JPbb75If4aTe5OQ7h0/pFNdrncQ+5RFgZWZccBlvimKqXGadDhFRQjT4vJTez9zBNqENf7DDBa/gs3cYEX7LdweOY778e5zZfz7aoRtd5/Ad8ubblbhFJ66ANGAqegSZcEtEzJakhCmSvjbKGUsaMJMRRxoQMTikIVFunmASBanR1U10PtvRj3r0T7Oaowfn/kODm5PQsWTdA+LjS1uZbKKhDQgoHba+ZdNIGa1rdUwutCd61UoB2KmhQqmWt9cITTT1VVFijhFCyZRTV6NL6u5igOt+gDmnDe+1Nj7kIAnPQHBvdEmwDGBVAtJpoVKPTMZWY5nGeqvNU4DavqrxBeXVTnWR/Fwv4MueF77/kYu/rPIbZl+qnnShpSENJuxTNZT+X6huEmMGXde1tnl/6fShhkhGyQJlzhlSqRcHqdzstMkLgVAVvrNSG9sor2QvZa6JbcITLvueSCkWl0M4K53rpQwjO9Cx4YwwxqEawuLc6HozUWnPVY218wJxJgp2XPZbSCUGE0K0U73isroalzkhnLTMUO6M45l4R7IITWGvCaM+dYZ699+ibFfXCCm2UXJl5pe3F9nzR4AJyguENLZfR53Ea+1K9uK56R9SbOZs47Qf79Mu43zzjrfAt/Mg/vQN//6sJv81pefyq1c2PMeF/V3U3o7+HXC3usDEtd/6j4nIeStzeZbABwuUY4GPTQ412YKc5w259XteLT5BXGJv56LDzdBmHIU7gxxQm1LVcKtNwLvUL3v9OVKptpGjZ4XA4fAcAAP//AwDt9x8mzgUAAA==
|
||||
@@ -1,5 +0,0 @@
|
||||
https://dc.services.visualstudio.com/v2/track
|
||||
Content-Type:application/x-json-stream
|
||||
Content-Encoding:gzip
|
||||
|
||||
H4sIAAAAAAAACpSTQW/cIBCF/4o1Z+MAxjb41m5aNYqqRE3UVr1hGLqoDqwwTltF+98rvFsl6a03NGKG9743PEHQDwgjvDkc3j1iyAvUkP1W4pT3hLaEsXtGR8ZHOjSUDlJ1wzeowV/jbxhhEMYwo5C02CMRlnZkap0h1qJilFnKO1Fm6u8LjE+gfWPx0Rts4vIZ0+JjgBG++GDjz/K29o2Z42qbFGe8CkvWwRQxl+/uru9vbslOMLq7eXu6ueBSBjTewgia9+iYc0SYqSNCSUWUkB1Bw6dBiN7oYTq1+ZAxBT03i/3xrMHGHDCbkTe8bSjhCo41WJ11kT3pBe9/H4qSDdNlqddbeTuOT/CICUZe/wV6GndhZn9h4sODDvbC+eCXPdRwSPGAKXvckGwu51lnH0N1fmQ3ewwZari5q25nnV1MD6843Z2sX/2H84/a7H3A6uoSRpBKOGmUI6KzHREoBVGypURbVIPFrpVUQg27GLIPa1yX6ipk/J42lTDCez0veNL3Jpm9z2jymor0r33JG3/5vIu2FBjUcJuiXU2unnEz2tCG0bbMWPNhzdUntD6hyVg83af1PP6fFt5zSouyNSUMubrVeV990MseRkAr2GCN0r1UzA1m6F3XO0llixMVvXOiZ93A+k5Oupsm1xtr7aQct0YpRVXRXdKttoXqxKQ7y1piBR+IaFtNtLGGcKkH12ojlSs78Iy1uplLn+onrbliZFKDIMIMlEx26oiUlDMnJsUNf4HknLgouK8xBZxfWP7oTYpLdLk6R1+9gvBpDeWzVtsa/PSB/NrgX0bzA1NVwtM+lL0853U8Ho9/AAAA//8DAPBoK+/zAwAA
|
||||
@@ -1,5 +0,0 @@
|
||||
https://dc.services.visualstudio.com/v2/track
|
||||
Content-Type:application/x-json-stream
|
||||
Content-Encoding:gzip
|
||||
|
||||
H4sIAAAAAAAACpSTT0/cMBDFv0o053WwHSexc6MLVRGqQGXVVr35zxgsgrNyHApC+90rZ7ei7a2XKBplZt77vckbRP2EMMD5fn/5jDHPsIEc1hKnvCO0IYztGB0YH2hfUyqUEPIHbCBc4ysM0AtrmVVIGuyQCEdbYhpviXOoGGWO8laUmfp+huENdKgdPgeL9TR/xTSHKcIA30J008+yW4fajtPi6jSNeBXnrKMtYi4u7653N7dkKxjd3nw4fjnjXAbUwcEAmnfomfdEWNMSoaQiSsiWoOWmF6KzujfHthAzpqjHenaP7xrclCNmO/CaNzUlXMFhA05nXWQbPePudV+UrJguSn2zltfX4Q2eMcHAN7+BHsed2TGcPc1mCaM7Oz6znh+L032a9phywJXLanUcdQ5TrE6btmPAmGEDN3fV7aizn9LTX7Dujv6v/sP+rmy/fEG7ZHTbaYkZBhAloc/aPoSI1dUFDCCV8NIqT0TrWiJQCqJkQ4l2qHqHbSOphA1sp5hDXKZlrq5ixvu06ocBPupxxqPy82QfQkabl1RMfe/Ksts0ucXm6h0/ozWtGW1K05L3S66+oAsJbcZib5eW07x/WnjHKS1SlpQw5upW54fqk54fYAB0gvXOKt1JxXxv+863nZdUNmio6LwXHWt71rXS6NYY31nnnFGeO6uUogo2gCXtaj0wRi1tlLNE6oYR0bKWGImWeIPoJGtM1xT17xyrm7H0qc5ozRUjRvWCCNtTYpxpiZSUMy+M4pb/geQUvih8rzFFHP+w/DnYNM2Tz9XpCqq/IHxZYvl5q/UifoZIXlbaF5N9xFSVtHSI5U5PAR0Oh8MvAAAA//8DADPqJ3gDBAAA
|
||||
@@ -1,5 +0,0 @@
|
||||
https://dc.services.visualstudio.com/v2/track
|
||||
Content-Type:application/x-json-stream
|
||||
Content-Encoding:gzip
|
||||
|
||||
H4sIAAAAAAAACpSUTW8cKRCG/0qLc9MGmqabvjljR2tZka14lF3lxkcRI7dhBLQTy5r/vqJnIsen1V4QKqjirect8YaCegY0o8vD4foFQsmoRcVvIUaYwKTHlO4pmSmbydgR0lPK+++oRf4WXtGMRm4MNRJwDwIwt2TAuncGWwuSEmoJG3itqX5kNL8h5TsLL95AF/M3SNnHgGb0tw82/qxvK9+ZJa62S3GBm5CLCqaKubp+uN3f3eMdp2R39+l0M0OuBTpv0YwUE+Coc5gbPWAuJ4klnwYMhumRc2HUqE9pPhRIQS1dtk/vGmwsAYqZWcf6jmAm0bFFVhVVZWuVYf96qEo2TFc13m7hbTu/oRdIaGbtb6Cnchdm8RfPWa9+sRentaj8lLfVKVNiekUtOqR4gFQ8bIwuc4ZnvbzuVX76fLpTt/n6F5i1gN3FNRQ0o35CLdoYLYsqPobmLHG3eAhlOyzJh+zNf5USqEV3D839ooqL6fmDJQ8nyjf/A/IXZR59gObmCs1oktxNRjrMBztgDhPHcuoJVhbkaGHoJ1Ib2cVQfFjjmpubUOBH2lpCM/qslgwnfZfJPPoCpqyp9vmPqKN1n6JdTWneraSkIx0lfU1ay2EtzVewPoEpUJvYp/Vc79vHFCYYIVXKmhKE0tyr8tj8pfIjmhFYTkdrpBKTpG40o3CDcBOZetCEC+e4oMNIxTBpNWjthLHWaumYNVJKIlGLoE5Osw1rTy11Qhg8ibHHXGqBtRt7bB3lVDAYqaoZ7xybu6XmSaGVYpJiLUeOuRkJ1lYPeJoIo45ryQz7A8l5HnjlewspwPJHy1+8STFHV5qz180HCF/XUD+CZvP9pw/410b7KponSE11S/lQZ/5s0PF4PP4LAAD//wMAQozcs08EAAA=
|
||||
@@ -0,0 +1,5 @@
|
||||
https://dc.services.visualstudio.com/v2/track
|
||||
Content-Type:application/x-json-stream
|
||||
Content-Encoding:gzip
|
||||
|
||||
H4sIAAAAAAAACoxUTW/jNhD9KwLPokJJlEQK6CF1smiQpg5ib7fojR/DmIhMGhSVbBDkvy8oK2tne+mNGHJm3rz3hm/IiT2gHl0eDtfP4OKIchTtHKpI1WJS47LakrIvq57yom5KQmv2L8qRvYVX1KOOKlUqDriGFjDVpMGyNgprDbwkpSZVQ1NN8Tii/g0JW2h4tgoKP/4NYbTeoR59s077l9Rb2EINftJF8APcuDEKpxKYq+vN7XZ9j1e0JKv178eXI4ypQGE16pGgrdRUCUyULjFthMJS6AoTCoSYjlWG82OadRGCE0Mx6qcTBu2jg6j6qqjqguCKo/ccaRFFgi3FCNvXQ0Iy03SV4vkcno/9G3qGgPoq/yD0WO5CDfZiP8rJDvoiivAI0QSxhxcfnuBZDChHh+APEKKFmZ/1JjtBKklBiqqtCEE5uhNqZx1kN1fZekgD81YKUfESS95RTFVHsNSywYyRqjRU8kpVKEe3EBwMZ1XvrAp+9CZmC+3Zpz4r76J1k5/G7MZFeAwiHvO+iGEElKP7SQ523D2A0K9b/zClOzcNaZbVFAK4mN2LuMv+EOMO9Qg0LTutuGgZL02nutY0rWGE1SAJbY2hbdl0ZdswKRopTau01pKbSivOOUmarad4mOLC/zfrrr+f4dgGu9+DPoHYzjTfDyIaH/Y3Gly0xiZ1znw2W2sY5tmypfJqsODiJ6pRjxinhiluMG10gykwijmrCRYaeKehqRlhR9qMfZx+skWM0bQ2DWOt5LIkUJmOUdIZSbQyteK6kdBVHekYMK4IkQ0tmeSKaCgbqtOAwetJxV8NUZIa5ehhcmlPs5s0+Yt1+HtLT6TcBx+98sOJlf+otvL7gx9tTJObRdqvI9x5l26XP+Bz8qWPpxikPcjm1ZNKgjZNjbViBlMpBBai45jKWglGJG1aiXJ05dUThCwZTFg3C/LhqfUmuwxqZyOoOIXU+Z95nKOWXz5W5sRE8df1duUDXB4O+RL97ZkVycDrTfYh/ifJv47p9c6PaYgYpjMPbWAwH7DOnHT0XfYA2gZQcb7aHhMXij65a8m6DNEaoeKYtuBPr2ZHLBZbnvza74z/n9nH5mcaLG5YKtFkus3xA5w98L/+v/f39/cfAAAA//8DAI8VPMr0BQAA
|
||||
@@ -0,0 +1,5 @@
|
||||
https://dc.services.visualstudio.com/v2/track
|
||||
Content-Type:application/x-json-stream
|
||||
Content-Encoding:gzip
|
||||
|
||||
H4sIAAAAAAAACpSTW2/cIBCF/4o1z8YBjC/4Ld2kahRFiZqorfqGYciiOLDCOBdF+98rvFsl6Vvf0IgZzvnO8AZePSIMcLrbnT+hTzOUkNxa4pS3hNaE8TvKBsYHIauWcd607DeU4C7xFQbohNZMSyQ1tkiEoQ0Za6uJMSgZZYbyRuSZ6n6G4Q2Uqww+OY1VmH9gnF3wMMBP5014zm8rV+kpLKaKYcILPyfldRZzdn57eXd9QzaC0c31l8PNGec8oHIGBlCiHY3QilBtGBGN0mRUhhMqkFLb9dxKeWhzPmH0aqpm8/CuwYTkMemBV7yuKOES9iUYlVSWPaoZ7153WcmK6SzXy7W8Hoc3eMIIAy//Aj2MO9GTO9Hh8VF5c2Kdd/MWStjFsMOYHK5IVpfTpJILvjg+spkc+gQlXN8WN5NKNsTHT5xuD9Yv/sP5ldJb57G4OIMBeilsr6UlojENEdgLIvuaEmVQdgabuqc9lLAJPjm/hGUuLnzC+7iqhAG+qmnGg77TqLcuoU5LzNJ/tTlvfHFpE0wuMCjhJgaz6FS842a0ohWjdZ6xpN2Siu9oXESdMHu6i8tx/D8tvOWUZmVLjOhTcaPStvim5i0MgEawzmip2l4y2+mutU1re9rXOFLRWita1nSsbfpRNeNoW22MGaXlRkspaYaEOd1iXShTC9GxWpJ+3WzdSaJw5KQTomtHYzWqbO0da3E95T7ZjkpxycgoO5H7KBnN2JC+p5xZMUqu+Qckx8RFxn2J0eP0wfKV0zHMwabiGH3xCcL3xefPWqxr8Ow8eVnhnwX9gLHI4Snn814e89rv9/s/AAAA//8DAPk3YPjzAwAA
|
||||
@@ -0,0 +1,5 @@
|
||||
https://dc.services.visualstudio.com/v2/track
|
||||
Content-Type:application/x-json-stream
|
||||
Content-Encoding:gzip
|
||||
|
||||
H4sIAAAAAAAACpSUTW/cNhCG/4rAsyjzmxzdUjtFXSOwES/aojd+jGwhWmpBUU4DY/97IXmDxL31Rgw4M+88fDmvJPsjkp58OJ0+vmCuC2lJHfeQYMJQJikXB8Z7LnumOm2Vsxz+Ji0Z7/Ab6YlVMfIISCUapCoxTYMcIk0JgTOemNBqq+mfFtK/Ej92CV/GiN28/IFlGedMevLnmNP8devtxy5O85q6Mk94m5fqc9zE3Hx8vDvcP9Brxdn1/S9vNxdctgLdmEhPgo2ScadpEANQBYpR4FzSAWzU4EErr9/SxlyxZD91S/ryQ0Oaa8Yae9EJ2TEqgJxbknz1m+zgFzx8O21Kdkw3W7zdw/uxfyUvWEgv2u9A38pdxWm8qvNpwhecTr4sWK7ifDz6nEhLTmU+Yakj7mj2aafJ13HOzaXZ9TRirqQl94/Nw+TrMJfjO16Pbwhu/weBFyyB9EQyLY21qKSUHkwQDJM10RgRomd2CAJ5RKZBWeCWcQmCgdTGOps8g0ha8jTNwU+/Lzs/ECy4xKwwAhWCUMZAZCgdDtoiS96YYFyEJJ0VyiUnPXjPIaCNYOJmkk8+Po8Zm9sb0hMHanARBqp00lShUxScZNQnBJtQS8ccacn1nOuY13ldmttc8ans/EhPfvXTgm/kPpT4PFaMdS0b1L/M1uyhzGmNtfnhAM461nEmt6S1ntbafMY0FowVN7yHsl7q/SdFGMHYJmUtBXNtHnx9bn7zyzPpCSbFbYrgjQM+2GjNoM3gmJMYmDLDoAzXlhvtgtchDCamlAIMIkUAYEBagpvhmt3jPhqvrE3UGKmpiiZQiInTQSarOUTpXXjHsbmftjwwwXsBnAawiqpoGQ0paOocE3xQAUQUPyG5mE9tfO+wZJx+GvnTGMu8zENtLi5s3kH4vOZtfzS7I7+Omf6z076Z4xcszfZafszbV7k80LklR/TLWvC4r5/+lTxs/6Q57FtIQAeK85Y8Vl/qerqEpeosKH0+n8//AgAA//8DAMTD+KDDBAAA
|
||||
@@ -0,0 +1,5 @@
|
||||
https://dc.services.visualstudio.com/v2/track
|
||||
Content-Type:application/x-json-stream
|
||||
Content-Encoding:gzip
|
||||
|
||||
H4sIAAAAAAAACpSU227cNhCGX0XgtSjzfNBdaqeoYQRexEZb9I6HUUxESy0oymlg7LsX1G7hpHe9Iwac4T/f/Jw3lN0R0Ig+nE4fXyHXFfWopj3ECFOYcEzZM6Ej5SMRgxaEE0P/Qj1KD/AdjUiLEGiwgDkowCISiT2fAo4RLCU0EiZFq+m+rGh8Qy4NEV5TgGFZf4eypiWjEf2Rcly+tbddGsK8bHEoywz3ea0uhybm7uPTw/PjAd8KSm4ff7ncXGFtBYYU0Yi8DpxQI7Fnk8XCCoItpRxPVgdpnZXCyUtayhVKdvOwxq/vGuJSM9QwsoHxgWBm0blH0VXXZHu3wvP3U1OyY7pr8X4P78fxDb1CQSPr/wV6KXcT5nSzbn6GV5hPrqxQbsJyPLocUY9OZTlBqQl2NK9Q/LKm2qiGoJ0xlEbjtJA6Gi4Z15ETiIZoGW20Tgk1sSDlFL2xWkwiMiqiAiG8Rj3a4c2zq2nJ3VX77ZwgV9Sjx6fuMLs6LeX4E/6nC9H7/wG0yUYj4kRypTUIzrmzyjMCUaugFPPBET15BjQAkVZoSzWh3DJiuVTa6OiIDahHn1x4SRm6+zs0ImPFZIKdsJBRYgFGYGs4wS6C1REkN8SgHt0uuaa8Ldva3ecKX8reLxrRr25e4dLphxJeUoVQt9Ig/KmaIQ9liVuo3bsBKBnIQAlvSVs9bbX7DDEVCBUajueyXev9J4UpRkiTspUCuXYHV1+639z6gkYEUVAdg3XKWDrpoNUk1WSI4eCJUNMkFJWaKmm8k95PKsQYvZ1YDNZaYlGPoPmt2y2uLBNaWYoDiRYL7wj2jjnMhAiTUMKbffLvHLvHueVZ5Z1jlmJvtcAiaIJ99BIbQxidhLcssB+QXM0iGt8HKBnmH1r+lEJZ1mWq3dU13U8QPm+5rY9ud9C3lPHfO+27JXyF0rVpuZTbT7kO6NyjI7h1K3Dct8/4hg7tm3TP+xJidrCC0h49VVfqdrqGuRi0FfJ8Pp//AQAA//8DAEwV3yvCBAAA
|
||||
@@ -0,0 +1,5 @@
|
||||
https://dc.services.visualstudio.com/v2/track
|
||||
Content-Type:application/x-json-stream
|
||||
Content-Encoding:gzip
|
||||
|
||||
H4sIAAAAAAAACpSU0W7cKhCGX8Waa+MABtv4LmeTqlFUJWpW7dG5wzA0KA5eAU4bRfvuFd6t2lxV5wahgRn++f4RbxD0M8IIl4fD9QuGnKCG7LcQp7wjtCWM7ykbWTu2qpGtlL2Q/0EN/hZfYYReGMOMQtJih0RYKsnUOkOsRcUos5RLUWrqbwnGN9C+sfjiDTZL+oIx+SXACF99sMv38rb2jZmX1TZxmfEmpKyDKWKurh9u93f3ZCcY3d39c7qZMJUCjbcwwtSblrJBkok7RYQSlCjGWuJUb6TSSgotT2k+ZIxBz02yT7812CUHzGbkDW8bSriCYw1WZ11kTzrh/vVQlGyYrkq83sLbdnyDF4ww8voX0FO5CzP7i+c0rX62F6c16/SUttVpk5f4CjUc4nLAmD1ujC5Twudpft3r9PThdKds0/UPNGtGu1vWkGGEdoAaNkbzrLNfQnWWuJs9hrwd5uhD8uZvpTqo4e6hup91dkt8fmfJw4nyzf+A/EmbRx+wurmCEQYl3GCUI0JaSQQOgqihpURbVL1F2Q60NLJbQvZhXdZU3YSM3+LWEozwQc8JT/ouo3n0GU1eY+nz366M1n1c7Gpy9dtKRhvaMNqWpDUf1lx9RusjmoyliX1cz/W+vE/hHae0SFljxJCre50fq486PcIIaAXrrVG6GxRzvek7Jzs30KHFiYrOOdEx2bNODpOW0+Q6Y62dlOPWKKWoghqwTE61Das2QiiOmqiWSyKsM0SziZFWctWJzmnN3TuO1d1c8lQ3ac0VI5PqBRGmp2SykyTDQDlzYlLc8D+QnOdBFL63GAPOf7T8yZu4pMXl6ux19Q7C5zWUj6DafP/uA/mx0b5azBPGqrilfSgzfzboeDwefwIAAP//AwB8EUERTwQAAA==
|
||||
@@ -0,0 +1,5 @@
|
||||
https://dc.services.visualstudio.com/v2/track
|
||||
Content-Type:application/x-json-stream
|
||||
Content-Encoding:gzip
|
||||
|
||||
H4sIAAAAAAAACpRUy07kRhT9Fau26fLU++EdQzMKQgxoaCVRdvW4hgrucqtchiDEv49sYAYYZZGNZV3dx7nnnFuPKLs9oA4dHQ4nd5DrhDaopjXECFOYcEzZjtCO8o7bVgpOKLd/ow1KZ/CAOqRFCDRYwBwUYBGJxJ73AccIlhIaCZNi6emuJ9Q9IpfaCHcpQDtOf0CZ0phRh/5MOY73y2yX2jCMc2zLOMBpnqrLYQGzPbk6211c4mNByfHF5+fMCaalQZsi6pDXgRNqJPast1hYQbCllOPe6iCts1I4+VyWcoWS3dBO8fYnhjjWDDV0rGW8JZhZ9LRB0VW3wPZugt3DYUGy0rRd4ps1vP52j+gOCurY5pXQ53afwpA+7Sc/pyF+Wr9ogw5lPECpCVZG1iWHwdU05uZlxvGQIFe0QZ+Xkqs5BJgm1KEvbpjgNXySr1OGL8Xt4X4st1+f57ZfT3Zogy7L+A+EeunqzSKSMdFYsBQCA0OEIrJnWlFLNKjeWO0spYxZRYinjEkVvdYQqXFeMwULbxdXzeXgaj+W/TvBrp41OP0fElwdHZ9k5weIH1fauXINFXVIKumB94Ypr1x0lpueOuA2Bs+VBON1NKA1Z9wFGYihgWoqndVSasUZRRt07sJNytCcblGHjBW9CbbHQkaJBRiBreEEuwhWR5DcEIM26HjMNeV5nKfmNFe4Lqsqb1BeXDVHJdykCqHOZeH7L7XY+7KMcQ61+WknSlrSUsKXorke5tp8g5gKhLquvSvzS78PJUwxQhYocymQa7Mo2PzupkVGiILqGKxTxtJeB616qXpDDAdPhOp7oajUVEnjnfS+VyHG6G3PYrDWEos2CBb3NuvBqF5Yy6TEHITFwpuIrbYe6z7Y0CsXwJN3PDYXw1JnlXeOWYq91QKLoAn20UtsDGG0F96ywN579M2KZmGFtlqtzLzS9mJ7sWhwBiXD8IaW8xTKOI19bV5c17wj6s2cbZoOg3v4ZdxvgQkuA4cf+cc3EG5/NeG3OS+PX7O6+T5l/O+q7nYMt1CaxR0u5eXOf1Scz0NNu5sCLkI8HyN8bPq0QXtw01xgvz6v68VnKCuM7fzssNN8noYhTRDGHCfUcWEMbymx8gXvfydaZVrDqXl6enr6DgAA//8DAMCQ7JfOBQAA
|
||||
@@ -0,0 +1,5 @@
|
||||
https://dc.services.visualstudio.com/v2/track
|
||||
Content-Type:application/x-json-stream
|
||||
Content-Encoding:gzip
|
||||
|
||||
H4sIAAAAAAAACpSTQW/cIBCF/4o1Z+MABtv41m5aNYqqRE3UVr1hGLqoDqwwTltF+98rvFsl6a03NGKG9743PEHQDwgjvDkc3j1iyAvUkP1W4pR3hLaE8XvKRtaOrWqkYKKXwzeowV/jbxihF8Ywo5C02CERlkoytc4Qa1ExyizlUpSZ+vsC4xNo31h89AabuHzGtPgYYIQvPtj4s7ytfWPmuNomxRmvwpJ1MEXM5bu76/ubW7ITjO5u3p5uLriUAY23MMLUm5ayQZKJO0WEEpQoxlriVG+k0koKLU9tPmRMQc/NYn88a7AxB8xm5A1vG0q4gmMNVmddZE96wfvfh6Jkw3RZ6vVW3o7jEzxigpHXf4Gexl2Y2V+Y+PCgg71wPvhlDzUcUjxgyh43JJvLedbZx1CdH9nNHkOGGm7uqttZZxfTwytOdyfrV//h/KM2ex+wurqEEQYl3GCUI0JaSQQOgqihpURbVL1F2Q50gBp2MWQf1rgu1VXI+D1tKmGE93pe8KTvTTJ7n9HkNRXpX7uSN/7yeRdtKTCo4TZFu5pcPeNmtKENo22ZsebDmqtPaH1Ck7F4uk/refw/LbzjlBZla0oYcnWr8776oJc9jIBWsN4apbtBMdebvnOycwMdWpyo6JwTHZM96+QwaTlNrjPW2kk5bo1Siqqiu6RbbQtlWds7nCxpJzREUCPJpPqWIEehGaXU2eL0GWt1M5c+1U1ac8XKbUGE6SmZ7CTJMFDOnJgUN/wFknPiouC+xhRwfmH5ozcpLtHl6hx99QrCpzWUz1pta/DTB/Jrg38ZzQ9MVQlP+1D28pzX8Xg8/gEAAP//AwBJsyo48wMAAA==
|
||||
@@ -0,0 +1,5 @@
|
||||
https://dc.services.visualstudio.com/v2/track
|
||||
Content-Type:application/x-json-stream
|
||||
Content-Encoding:gzip
|
||||
|
||||
H4sIAAAAAAAACpSTT2+cMBDFvwqaMya2sQFzS3dTdRVFGzWrturN2EPWCjErY/JH0X73yuxWSXrrBaERM/Pe7w1v4PUjQguXh8PVE/o4QQ7RLSVOeUVoSRjfUdaysi1VIQUtlap+Qw7uGl+hhVoYw4xCUmKFRFgqSVf2hliLilFmKZcizdT3E7RvoF1h8ckZLMbpB4bJjR5a+Om8HZ/Tbu0KM4yzLcI44MZPUXuTxKyv7q5321uyEoyutl9OX044pQGFs9BCV5uSskaSjveKCCUoUYyVpFe1kUorKbQ8tTkfMXg9FJN9eNdgx+gxmpYXvCwo4QqOOVgddZLd6Ql3r4ekZMG0TvV8KS+v7Rs8YYCW53+BnsZdmMFdPE7d7AZ7cXpGPT0kp4cwHjBEhwuXxeow6OhGn503rQaHPkIO27vsdtCxH8PjJ1h3J/+b/7C/S9uvXtDMEe1qnH2EFkRK6EabvfOYbdbQQqNE3xjVEyGtJAIbQVRTUqItqtqiLBvaQA6r0Ufn53Geso2PeB8W/dDCVz1MeFJ+GczeRTRxDsnUryotuw2jnU3M3vEzWtCC0TI1zfEwx+w7WhfQREz2dmE+z/unhVec0iRlDgF9zG513Gff9LSHFtAKVlujdNUo1temrnpZ9Q1tSuyoqPpeVEzWrJJNp2XX9ZWx1naq59YopaiCHDClnS0HZmSltRIVYQw1EUYK0pSqJ6iFaapa8rpJQt45Ztsh9amq05orRjpVCyJMTUlnO0mahnLWi05xwz8gOYcvEt9rDB6HD5ZvnAnjNPYxO19B9gnC99mnnzdbLuLZefKy0F6P5gFDltLSzqc7PQd0PB6PfwAAAP//AwDhQYZRAwQAAA==
|
||||
@@ -156,6 +156,7 @@ namespace COFTester.Services
|
||||
protected bool _isConnected;
|
||||
protected bool _isAcquiring;
|
||||
protected CancellationTokenSource? _cts;
|
||||
protected Task? _acquisitionTask;
|
||||
|
||||
public event EventHandler<TestDataPoint>? DataReceived;
|
||||
public event EventHandler? TestFinished;
|
||||
@@ -203,7 +204,7 @@ namespace COFTester.Services
|
||||
_isAcquiring = true;
|
||||
_cts = new CancellationTokenSource();
|
||||
|
||||
Task.Run(async () => await AcquisitionLoopAsync(parameters, _cts.Token), _cts.Token);
|
||||
_acquisitionTask = Task.Run(async () => await AcquisitionLoopAsync(parameters, _cts.Token), _cts.Token);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -216,6 +217,38 @@ namespace COFTester.Services
|
||||
_isAcquiring = false;
|
||||
}
|
||||
|
||||
protected virtual async Task WaitForAcquisitionToStopAsync(int timeoutMs = 5000)
|
||||
{
|
||||
var acquisitionTask = _acquisitionTask;
|
||||
if (acquisitionTask == null || acquisitionTask.IsCompleted)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
var completedTask = await Task.WhenAny(acquisitionTask, Task.Delay(timeoutMs));
|
||||
if (completedTask == acquisitionTask)
|
||||
{
|
||||
await acquisitionTask;
|
||||
}
|
||||
else
|
||||
{
|
||||
System.Diagnostics.Debug.WriteLine($"[Modbus] 等待采集停止超时: {timeoutMs}ms");
|
||||
}
|
||||
}
|
||||
catch (OperationCanceledException)
|
||||
{
|
||||
}
|
||||
finally
|
||||
{
|
||||
if (acquisitionTask.IsCompleted)
|
||||
{
|
||||
_acquisitionTask = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 重置傳感器(已廢棄)
|
||||
/// 注意:ControlRegister 不存在,請使用 ToggleResetAsync(1301) 進行復位
|
||||
@@ -650,6 +683,9 @@ namespace COFTester.Services
|
||||
{
|
||||
const ushort STOP_BUTTON_ADDRESS = 32; // M32 停止按钮
|
||||
|
||||
StopAcquisition();
|
||||
await WaitForAcquisitionToStopAsync();
|
||||
|
||||
System.Diagnostics.Debug.WriteLine($"[Modbus] 触发测试停止按钮 M{STOP_BUTTON_ADDRESS}");
|
||||
|
||||
await _modbusMaster.WriteSingleCoilAsync(1, STOP_BUTTON_ADDRESS, true);
|
||||
|
||||
@@ -28,6 +28,11 @@ namespace COFTester.ViewModels
|
||||
private readonly AppConfig _config;
|
||||
private ScottPlot.Plottables.Scatter? _scatterPlot;
|
||||
private readonly Dictionary<Guid, ScottPlot.Plottables.Scatter> _testCurves = new();
|
||||
private readonly object _pendingUiPointsLock = new();
|
||||
private readonly List<TestDataPoint> _pendingUiPoints = new();
|
||||
private bool _isUiDataUpdateQueued;
|
||||
private long _lastPlotRefreshTick;
|
||||
private const int PlotRefreshIntervalMs = 100;
|
||||
|
||||
private double _currentForce;
|
||||
private double _currentDisp;
|
||||
@@ -616,31 +621,39 @@ namespace COFTester.ViewModels
|
||||
{
|
||||
return;
|
||||
}
|
||||
// 使用 Dispatcher 確保在 UI 線程更新
|
||||
Application.Current?.Dispatcher.InvokeAsync(() =>
|
||||
|
||||
bool shouldQueueUiUpdate;
|
||||
lock (_pendingUiPointsLock)
|
||||
{
|
||||
if (!_acceptIncomingTestData || sessionId != Volatile.Read(ref _testSessionId))
|
||||
{
|
||||
return;
|
||||
}
|
||||
// 更新力值和位移
|
||||
CurrentForce = point.Force;
|
||||
CurrentDisp = point.Displacement;
|
||||
|
||||
// 更新實際位置數據(從 PLC 讀取)
|
||||
LiftPosition = point.VerticalPosition; // D12 升降位置
|
||||
HorizontalPosition = point.HorizontalPosition; // D16 水平位置
|
||||
|
||||
_realTimePoints.Add(point);
|
||||
OnPropertyChanged(nameof(DataPointsCount));
|
||||
UpdateScottPlot();
|
||||
});
|
||||
|
||||
_pendingUiPoints.Add(point);
|
||||
shouldQueueUiUpdate = !_isUiDataUpdateQueued;
|
||||
if (shouldQueueUiUpdate)
|
||||
{
|
||||
_isUiDataUpdateQueued = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (!shouldQueueUiUpdate)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
Application.Current?.Dispatcher.InvokeAsync(() =>
|
||||
{
|
||||
ApplyPendingUiPoints(sessionId);
|
||||
}, DispatcherPriority.Background);
|
||||
}
|
||||
|
||||
private void OnTestFinished(object? sender, EventArgs e)
|
||||
{
|
||||
Application.Current?.Dispatcher.InvokeAsync(() =>
|
||||
{
|
||||
ApplyPendingUiPoints(Volatile.Read(ref _testSessionId), forcePlotRefresh: true);
|
||||
IsTesting = false;
|
||||
TestButtonText = Lang.StartTest; // 测试完成后恢复按钮文本
|
||||
_m31Status = false; // 测试完成,M31应该为0
|
||||
@@ -882,6 +895,8 @@ namespace COFTester.ViewModels
|
||||
int sessionId = Interlocked.Increment(ref _testSessionId);
|
||||
_isTestTransitioning = true;
|
||||
UpdateCanStartTest();
|
||||
ClearPendingUiPoints();
|
||||
_lastPlotRefreshTick = 0;
|
||||
|
||||
_realTimePoints.Clear();
|
||||
OnPropertyChanged(nameof(DataPointsCount));
|
||||
@@ -996,6 +1011,7 @@ namespace COFTester.ViewModels
|
||||
_stopRequestedByUser = true;
|
||||
_acceptIncomingTestData = false;
|
||||
_isTestTransitioning = true;
|
||||
ClearPendingUiPoints();
|
||||
_daqService.StopAcquisition();
|
||||
IsTesting = false;
|
||||
_m31Status = false;
|
||||
@@ -1046,6 +1062,7 @@ namespace COFTester.ViewModels
|
||||
|
||||
// 2. 清除界面数据(包括位置数据)
|
||||
_realTimePoints.Clear();
|
||||
ClearPendingUiPoints();
|
||||
OnPropertyChanged(nameof(DataPointsCount));
|
||||
LatestResult = null;
|
||||
CurrentForce = 0;
|
||||
@@ -1756,6 +1773,62 @@ namespace COFTester.ViewModels
|
||||
configWindow.ShowDialog();
|
||||
}
|
||||
|
||||
private void ApplyPendingUiPoints(int sessionId, bool forcePlotRefresh = false)
|
||||
{
|
||||
List<TestDataPoint> pendingPoints;
|
||||
lock (_pendingUiPointsLock)
|
||||
{
|
||||
pendingPoints = _pendingUiPoints.Count == 0 ? new List<TestDataPoint>() : new List<TestDataPoint>(_pendingUiPoints);
|
||||
_pendingUiPoints.Clear();
|
||||
_isUiDataUpdateQueued = false;
|
||||
}
|
||||
|
||||
if (pendingPoints.Count == 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (!_acceptIncomingTestData || sessionId != Volatile.Read(ref _testSessionId))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
var latestPoint = pendingPoints[pendingPoints.Count - 1];
|
||||
CurrentForce = latestPoint.Force;
|
||||
CurrentDisp = latestPoint.Displacement;
|
||||
LiftPosition = latestPoint.VerticalPosition;
|
||||
HorizontalPosition = latestPoint.HorizontalPosition;
|
||||
|
||||
_realTimePoints.AddRange(pendingPoints);
|
||||
OnPropertyChanged(nameof(DataPointsCount));
|
||||
|
||||
if (forcePlotRefresh || ShouldRefreshPlot())
|
||||
{
|
||||
UpdateScottPlot();
|
||||
}
|
||||
}
|
||||
|
||||
private bool ShouldRefreshPlot()
|
||||
{
|
||||
long now = Environment.TickCount64;
|
||||
if (now - _lastPlotRefreshTick < PlotRefreshIntervalMs)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
_lastPlotRefreshTick = now;
|
||||
return true;
|
||||
}
|
||||
|
||||
private void ClearPendingUiPoints()
|
||||
{
|
||||
lock (_pendingUiPointsLock)
|
||||
{
|
||||
_pendingUiPoints.Clear();
|
||||
_isUiDataUpdateQueued = false;
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region INotifyPropertyChanged
|
||||
|
||||
Reference in New Issue
Block a user