我正在尝试一个接一个地运行线程。我知道我可以连续执行它们,但重点是命令不会阻止UI。
然而,在我提出的实现中,我不能使用std::thread
,因为我不能将线程作为参数传递。
我还有其他办法吗?
这是我目前的实施:
#include <mutex>
#include <thread>
#include <queue>
class ThreadQueue {
std::queue <std::thread> threads;
std::mutex mutex_add;
std::mutex mutex_remove;
public:
ThreadQueue() {}
~ThreadQueue() {}
void add(std::thread thread) {
mutex_add.lock();
threads.push(thread);
mutex_add.unlock();
}
std::thread remove() {
mutex_remove.lock();
std::thread thread = threads.front;
threads.pop();
thread.join();
mutex_remove.unlock();
}
};
答案 0 :(得分:4)
我知道我可以连续进行,但重点是命令不会阻止用户界面。
我还有其他办法吗?
如前所述, <div ng-repeat="(key, value) in rowData">
<div ng-if="(key === 'id' || key.toLowerCase().endsWith('id') === false) ? true : false">
<label for="value" class="col-sm-2">{{key}}</label>
<div class=" col-sm-2">
<input class="form-control rowValue"
ng-if="!isObject(rowData[key])"
type="text" ng-model="value"/>
<input
class="form-control rowValue"
ng-if="isObject(value) && key !== 'status' && key !== 'priority' && key !== 'severity'"
type="text" ng-model="value.name"/>
<select ng-if="isObject(value) && key == 'status'"
ng-model="statusId"
class="form-control rowValue"
id="statusId"
ng-options='item.id as item.name for item in eventService.statusOptions()' >
<option value=''>{{value.name}}</option>
</select>
<select ng-if="isObject(value) && key == 'priority'"
ng-model="priorityId"
class="form-control rowValue"
id="priorityId"
ng-options='item.id as item.name for item in eventService.priorityOptions()' >
<option value=''>{{value.name}}</option>
</select>
<select ng-if="isObject(value) && key == 'severity'"
ng-model="severityId"
class="form-control rowValue"
id="severityId"
ng-options='item.id as item.name for item in eventService.priorityOptions()' >
<option value=''>{{value.name}}</option>
</select>
</div>
</div>
</div>
是一个可移动的类类型,您可以使用std::thread
将它们传输到队列中。
但我认为使用std::move()
个实例的队列不是一个好设计。
假设您将线程实例放置到使用线程函数的队列中,它将立即启动。那么,队列的作用是什么呢?
线程一旦启动就应该从队列中弹出来吗?谁会去std::thread
呢?
作为@alexeibs suggests,你应该有一个线程,它执行从队列中读取的UI后台任务(例如join()
个对象)。
您甚至可以让多个线程(也称为thread pool)共享此类任务队列,并最大化您的可用CPU核心数量。利用率(理想情况下,您不应该拥有比可用CPU核心更多的活动线程)。
同步(互斥,用于通知的条件变量等)应该应用于队列本身。
答案 1 :(得分:2)
你可以移动线程:
所以你可以简单地修改你的代码。
<div ng-show="showme=='4'">
<body>
<div ng-app="app">
<div class="container">
<div ng-controller="ClientCtrl">
<div class="datagrid">
<table>
<thead>
<tr>
<th> Checks/Offers Received </th>
<th> Disbursement </th>
<th> Client Ins Settled Amount </th>
<th> Case Fee Percentage</th>
</tr>
</thead>
</table>
</div>
</div>
</div>
</div>
</body>
<body>
<div ng-app="offer">
<div class="container">
<div ng-controller="OfferCtrl">
<div class="datagrid">
<table>
<tbody>
<td>
<div class="dropdown">
<button class="dropbtn">Offers</button>
<div class="dropdown-content">
<li ng-repeat="offer in offers | filter:{clientid:clientId}">
<input type="text" value="{{offer.offeramnt}}" />
<a href="#">Offer 2</a>
<a href="#">Offer 3</a>
</li>
</div>
</div>
</td>
</tbody>
</table>
</div>
</div>
</div>
</div>
</body>
<body>
<div ng-app="check">
<div class="container">
<div ng-controller="CheckCtrl">
<div class="datagrid">
<table>
<tbody>
<td>
<div class="dropdown">
<button class="dropbtn">Checks</button>
<div class="dropdown-content">
<li ng-repeat="check in checks | filter:{clientid:clientId}">
<input type="text" value="{{check.checkamount}}" />
<a href="#">Check 2</a>
<a href="#">Check 3</a>
</li>
</div>
</div>
</td>
</tbody>
</table>
</div>
</div>
</div>
</div>
</body>
<body>
<div ng-app="app">
<div class="container">
<div ng-controller="ClientCtrl">
<div class="datagrid">
<table>
<tbody>
<tr>
<td>
<input type="string" value=" {{client.checksreceived}}" />
</td>
<td>
<input type="text" value="{{client.clientinssettlesamnt}}" />
</td>
<td>
<input type="number" value="{{client.casefeepercent}}" />
</td>
</tr>
</tbody>
<thead>
<tr>
<th> Adverse Settle Amount </th>
<th> Case cost </th>
<th> Line Item Fees</th>
<th> Loan Information </th>
</tr>
</thead>
<tbody>
<tr ng-repeat="client in clients | orderBy:'id' | filter:{id:clientId} | limitTo: 1 track by $index" ">
<td>
<input type="numer" value=" {{client.advsettleamnt}}"/>
</td>
<td>
<input type="number " value="{{client.Casecost}} "/>
</td>
<td>
<input type="number " value="{{client.lineitemfees}} "/>
</td>
<td>
<input type="text " value="{{client.bdf}} "/>
</td>
</tr>
</tbody>
</table>
<button type="submit " ng-click="updateClient() "><strong>Update</strong></button>
<a class="btn btn-primary " href="/intakeoffer/{{clientId}} ">
<strong>Add Offer</strong>
</a>
<a class="btn btn-primary " href="/intakecheck/{{clientId}} ">
<strong>Add check</strong>
</a>
</div>
</div>
</div>
但是说有其他方法可以解决这个问题,可能会更好。
而不是拥有可以添加和删除的线程队列。拥有由对象拥有的线程执行的作业队列。或者您只需使用void add(std::thread&& thread) {
// ^^
mutex_add.lock();
threads.push(std::move(thread));
// ^^^^^^^^^
mutex_add.unlock();
}
即可在后台启动作业。